From a199606f80fc9b4c308cdb6df46370ec3d166b3f Mon Sep 17 00:00:00 2001 From: czz <862977248@qq.com> Date: Fri, 1 Aug 2025 22:25:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/mhlangs/en_US.json | 18 +- assets/mhlangs/zh_CN.json | 6 +- assets/mhlangs/zh_TW.json | 4 +- lib/common/util/requestWithLog.dart | 13 +- lib/component/base/SleepCalendarWidget.dart | 112 ++++- lib/component/img/img_preview_widget.dart | 84 +++- lib/component/tool/TopSlideNotification.dart | 1 + lib/controller/date/CalendarController.dart | 3 + .../device/device_share_list_controller.dart | 2 +- .../apply_repair_controller.dart | 6 +- .../mh_controller/device_list_controller.dart | 4 +- .../mh_controller/issue_controller.dart | 8 +- .../mh_controller/message_controller.dart | 14 +- .../mhdevice_share_controller.dart | 21 +- lib/controller/user_info_controller.dart | 2 +- lib/language/AppLanguage.dart | 7 +- lib/main.dart | 35 +- .../device_bind/componnet/bind_dialog.dart | 213 ++++++++- .../component/main_page_b_bottom_change.dart | 1 - lib/pages/main_bottom/mine_page.dart | 37 +- lib/pages/mh_page/LanguagePage.dart | 74 +-- .../mh_page/ShareDeviceDetailWidget.dart | 34 +- lib/pages/mh_page/address_module_widget.dart | 74 +-- lib/pages/mh_page/apply_repair_page.dart | 32 +- .../controller/mht_bluetooth_controller.dart | 6 +- lib/pages/mh_page/edit_bed.dart | 251 +++++++--- .../mh_page/experience_store_widget.dart | 1 + .../controller/mht_home_controller.dart | 36 +- lib/pages/mh_page/homepage/new_Home_page.dart | 34 +- lib/pages/mh_page/issue_list_page.dart | 18 +- lib/pages/mh_page/issue_preview_widget.dart | 136 +++--- lib/pages/mh_page/message/messageDetail.dart | 14 +- lib/pages/mh_page/new_mine_page.dart | 291 +++++------- lib/pages/mh_page/repair_history_page.dart | 61 ++- lib/pages/mh_page/repair_list.dart | 123 +++-- .../mh_page/user/page/edit_userinfo_page.dart | 447 ++++++++++-------- .../component/AIAdviceWidget.dart | 11 +- .../component/BreathePauseNewWidget.dart | 8 +- .../component/BreatheStandardWidget.dart | 8 +- .../component/CompareSleepWidget.dart | 314 ++++++------ .../component/DiseasePercentsWidget.dart | 156 +++--- .../component/HeartChangeWidget.dart | 8 +- .../component/HeartHealthWidget.dart | 8 +- .../component/HeartPointWidget.dart | 13 +- .../component/HeartRateStandardWidget.dart | 8 +- .../component/SkinPercentWidget.dart | 8 +- .../sleep_report/component/SleepView.dart | 11 +- .../component/SnoreViewWidget.dart | 8 +- .../component/WeekSleepScoreWidget.dart | 21 +- .../component/ZiZhuShenJingPercentWidget.dart | 8 +- .../sleep_report/new_sleep_report_page.dart | 57 +-- pubspec.lock | 8 +- 52 files changed, 1736 insertions(+), 1142 deletions(-) diff --git a/assets/mhlangs/en_US.json b/assets/mhlangs/en_US.json index b544f63..8840f1e 100644 --- a/assets/mhlangs/en_US.json +++ b/assets/mhlangs/en_US.json @@ -270,8 +270,8 @@ "无效的手机号码": "Invalid Phone", "保存": "Save", "智能设备名称": "Smart Device Name", - "智能电动床": "Smart Electric Bed", - "律动智能床垫": "Massage Smart Mattress", + "智能电动床": "Bed", + "律动智能床垫": "Mattress", "更新设备信息": "Update Device Info", "修改名称成功": "Name Updated", "请输入设备的名称": "Enter Device Name", @@ -546,7 +546,7 @@ "正在打开微信客服...": "Opening WeChat Support...", "起床时间:": "Wake Up:", "入睡时间:": "Sleep Time", - "入睡时间": "Sleep Time", + "入睡时间": "Sleep Onset Time", "起床时间": "起床时间", "次": "Times", "次/分": "times/min", @@ -554,15 +554,15 @@ "sleep_duration": "Sleep Duration", "deep_sleep": "Deep Sleep", "light_sleep": "Light Sleep", - "小时": "hour", + "小时": "h", "今日": "Today", "30天平均分": "30-Day Average Score", "睡眠评分": "Sleep Score", "睡眠等级": "Sleep Level", "睡眠规律性": "Sleep Regularity", "睡眠规律性是指个体睡眠模式在时间、时长、环境等方面呈现出的稳定性和一致性,是衡量睡眠质量的重要指标之一。": "Sleep regularity reflects how consistent your sleep time, duration, and habits are — a key factor in overall sleep quality.", - "分钟": "min", - "睡眠时长": "Sleep Time", + "分钟": "m", + "睡眠时长": "Sleep Duration", "当前属于": " Current:", "与昨日对比分析": "Comparison with Yesterday", "基于时间维度的横向比较分析方法,通过将当前(今日)的数据、状态、行为等与前一日(昨日)的同类信息进行对照,识别差异、趋势或变化规律,查看用户短期时间序列的动态变化。": "A time-based horizontal comparison method that contrasts current (today's) data, status, and behaviors with those of the previous day (yesterday) to identify differences, trends, or patterns, enabling observation of short-term dynamic changes in the user's time series.", @@ -590,5 +590,9 @@ "自主神经平衡指数": "Autonomic Balance Index", "自主神经平衡指数 是评估人体自主神经系统(ANS)功能状态的重要指标,主要反映交感神经和副交感神经的活性平衡关系。": "The Autonomic Nervous System Balance Index is an important metric for assessing ANS function, reflecting the balance between sympathetic and parasympathetic nervous activity.", "皮肤指数": "Skin Index", - "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "The Skin Index is a composite metric derived from physiological data during sleep by measuring skin conductance. It evaluates physiological stress and autonomic nervous activity during sleep." + "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "The Skin Index is a composite metric derived from physiological data during sleep by measuring skin conductance. It evaluates physiological stress and autonomic nervous activity during sleep.", + "删除后": "After deletion", + "该设备的历史数据将被清除": "The device's historical data will be deleted", + "有一条新的设备分享消息": "You have a new device sharing message", + "去查看": "View now" } \ No newline at end of file diff --git a/assets/mhlangs/zh_CN.json b/assets/mhlangs/zh_CN.json index fafb2c7..c43c5fc 100644 --- a/assets/mhlangs/zh_CN.json +++ b/assets/mhlangs/zh_CN.json @@ -585,8 +585,10 @@ "心率健康评估主要通过用户睡眠报告中的时间点、体征数据及HRV数据等信息,来判断其心理健康水平、疲劳程度。": "心率健康评估主要通过用户睡眠报告中的时间点、体征数据及HRV数据等信息,来判断其心理健康水平、疲劳程度。", "慢性病风险指数": "慢性病风险指数", "慢性病风险指数是通过整合个体的生理指标、生活方式等多维度数据,构建的量化评估模型,用于预测用户未来患慢性非传染性疾病(如高血压、糖尿病、冠心病、癌症等)的风险概率。": "慢性病风险指数是通过整合个体的生理指标、生活方式等多维度数据,构建的量化评估模型,用于预测用户未来患慢性非传染性疾病(如高血压、糖尿病、冠心病、癌症等)的风险概率。", - "自主神经平衡指数":"自主神经平衡指数", + "自主神经平衡指数": "自主神经平衡指数", "自主神经平衡指数 是评估人体自主神经系统(ANS)功能状态的重要指标,主要反映交感神经和副交感神经的活性平衡关系。": "自主神经平衡指数 是评估人体自主神经系统(ANS)功能状态的重要指标,主要反映交感神经和副交感神经的活性平衡关系。", "皮肤指数": "皮肤指数", - "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。" + "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。", + "删除后": "删除后", + "该设备的历史数据将被清除": "该设备的历史数据将被清除","有一条新的设备分享消息":"有一条新的设备分享消息","去查看":"去查看" } \ No newline at end of file diff --git a/assets/mhlangs/zh_TW.json b/assets/mhlangs/zh_TW.json index 984b2e3..415eb50 100644 --- a/assets/mhlangs/zh_TW.json +++ b/assets/mhlangs/zh_TW.json @@ -588,5 +588,7 @@ "自主神经平衡指数": "自主神經平衡指數", "自主神经平衡指数 是评估人体自主神经系统(ANS)功能状态的重要指标,主要反映交感神经和副交感神经的活性平衡关系。": "自主神經平衡指數 是評估人體自主神經系統(ANS)功能狀態的重要指標,主要反映交感神經和副交感神經的活性平衡關係。", "皮肤指数": "皮膚指數", - "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "皮膚指數透過用戶睡眠過程中的體徵資料,計算皮膚電反應,生成綜合評估指標,用於睡眠中的生理應激狀態或自主神經活動。" + "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "皮膚指數透過用戶睡眠過程中的體徵資料,計算皮膚電反應,生成綜合評估指標,用於睡眠中的生理應激狀態或自主神經活動。", + "删除后": "刪除後", + "该设备的历史数据将被清除": "該設備的歷史數據將被清除","有一条新的设备分享消息": "有一條新的設備分享消息","去查看": "去查看" } \ No newline at end of file diff --git a/lib/common/util/requestWithLog.dart b/lib/common/util/requestWithLog.dart index c92fa14..1a05c2d 100644 --- a/lib/common/util/requestWithLog.dart +++ b/lib/common/util/requestWithLog.dart @@ -2,9 +2,11 @@ import 'dart:convert'; import 'package:EasyDartModule/EasyDartModule.dart'; import 'package:ef/ef.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/app_uri_status.dart'; import 'package:vbvs_app/common/util/DailyLogUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; +import 'package:vbvs_app/enum/APPPackageType.dart'; import 'package:vbvs_app/model/api_response.dart'; Future requestWithLog({ @@ -23,9 +25,16 @@ Future requestWithLog({ ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr); try { String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (AppConstants().ent_type == APPPackageType.MHT.code) { + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } + } else { + if (languageController.selectLanguage != null) { + language = languageController.selectLanguage.value!.language_code; + } } + if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { queryUrl += "&lang=$language"; diff --git a/lib/component/base/SleepCalendarWidget.dart b/lib/component/base/SleepCalendarWidget.dart index 8676e72..a0773b9 100644 --- a/lib/component/base/SleepCalendarWidget.dart +++ b/lib/component/base/SleepCalendarWidget.dart @@ -32,7 +32,7 @@ class SleepCalendarWidget extends StatefulWidget { class _SleepCalendarWidgetState extends State { CalendarController calendarController = Get.find(); - RxMap sleepDate = {}.obs; + RxMap sleepDate = {}.obs; RxList showLabel = [ {"level": 5, "name": "无报告", "color": "#9E9E9E"} ].obs; @@ -206,7 +206,8 @@ class _SleepCalendarWidgetState extends State { return Container( constraints: BoxConstraints(minHeight: 90.rpx), child: Row( - children: ["一".tr, "二".tr, "三".tr, "四".tr, "五".tr, "六".tr, "日".tr].map((day) { + children: + ["一".tr, "二".tr, "三".tr, "四".tr, "五".tr, "六".tr, "日".tr].map((day) { return Expanded( child: Center( child: Text( @@ -223,6 +224,96 @@ class _SleepCalendarWidgetState extends State { ); } + // Widget _buildCalendarGrid(List> calendarRows, + // DateTime? selectedDate, Map sleepDate) { + // final isMonthSelected = widget.type == 3; + + // Widget content = Column( + // children: calendarRows.map((week) { + // final isWeekSelected = widget.type == 2 && + // selectedDate != null && + // week.any((d) => + // d.year == selectedDate.year && + // d.month == selectedDate.month && + // d.day == selectedDate.day); + + // final row = Row( + // children: week.map((date) { + // if (date.year == 0) { + // return const Expanded(child: SizedBox.shrink()); + // } + + // final isSelected = widget.type == 1 && + // selectedDate != null && + // date.year == selectedDate.year && + // date.month == selectedDate.month && + // date.day == selectedDate.day; + + // return Expanded( + // child: SleepdateWidget( + // highlightColor: widget.highlightColor, // ✅ 传入高亮颜色 + // sleepDate: sleepDate, + // date: date, + // isSelected: isSelected, + // onTap: () { + // calendarController.selectDate(date); + // widget.onDateSelected?.call(date); + // Get.back(); + // }, + // ), + // ); + // }).toList(), + // ); + + // if (isWeekSelected) { + // return Container( + // decoration: BoxDecoration( + // color: widget.highlightColor, + // borderRadius: + // BorderRadius.circular(AppConstants().button_container_radius), + // ), + // padding: EdgeInsets.symmetric( + // vertical: 6.rpx, horizontal: 12.rpx), // 增加左右padding + // margin: EdgeInsets.symmetric(vertical: 6.rpx), + // child: row, + // ); + // } else { + // return row; + // } + // }).toList(), + // ); + + // // 如果是月份模式,包一层黑色背景容器 + // if (isMonthSelected && selectedDate != null) { + // final displayedMonth = calendarController.displayedMonth.value; + + // final isSameMonth = displayedMonth.year == selectedDate.year && + // displayedMonth.month == selectedDate.month; + + // if (isSameMonth) { + // // ✅ 当前显示的月 == 当前选中的月 → 加高亮外框 + // return Container( + // decoration: BoxDecoration( + // color: widget.highlightColor, // 背景淡色 + // borderRadius: + // BorderRadius.circular(AppConstants().normal_container_radius), + // // border: Border.all( + // // color: widget.highlightColor, + // // width: 2.rpx, + // // ), + // ), + // // padding: EdgeInsets.symmetric(vertical: 0.rpx, horizontal: 0.rpx), + // // margin: EdgeInsets.symmetric(vertical: 0.rpx), + // child: content, + // ); + // } else { + // return content; + // } + // } else { + // return content; + // } + // } + Widget _buildCalendarGrid(List> calendarRows, DateTime? selectedDate, Map sleepDate) { final isMonthSelected = widget.type == 3; @@ -250,7 +341,7 @@ class _SleepCalendarWidgetState extends State { return Expanded( child: SleepdateWidget( - highlightColor: widget.highlightColor, // ✅ 传入高亮颜色 + highlightColor: widget.highlightColor, sleepDate: sleepDate, date: date, isSelected: isSelected, @@ -271,8 +362,8 @@ class _SleepCalendarWidgetState extends State { borderRadius: BorderRadius.circular(AppConstants().button_container_radius), ), - padding: EdgeInsets.symmetric(vertical: 6.rpx), - margin: EdgeInsets.symmetric(vertical: 6.rpx), + // 把padding改成margin,避免Row宽度变化导致跳动 + margin: EdgeInsets.symmetric(vertical: 6.rpx, horizontal: 12.rpx), child: row, ); } else { @@ -281,7 +372,7 @@ class _SleepCalendarWidgetState extends State { }).toList(), ); - // 如果是月份模式,包一层黑色背景容器 + // 月视图高亮逻辑不变 if (isMonthSelected && selectedDate != null) { final displayedMonth = calendarController.displayedMonth.value; @@ -289,19 +380,12 @@ class _SleepCalendarWidgetState extends State { displayedMonth.month == selectedDate.month; if (isSameMonth) { - // ✅ 当前显示的月 == 当前选中的月 → 加高亮外框 return Container( decoration: BoxDecoration( - color: widget.highlightColor, // 背景淡色 + color: widget.highlightColor, borderRadius: BorderRadius.circular(AppConstants().normal_container_radius), - // border: Border.all( - // color: widget.highlightColor, - // width: 2.rpx, - // ), ), - // padding: EdgeInsets.symmetric(vertical: 0.rpx, horizontal: 0.rpx), - // margin: EdgeInsets.symmetric(vertical: 0.rpx), child: content, ); } else { diff --git a/lib/component/img/img_preview_widget.dart b/lib/component/img/img_preview_widget.dart index 832ec07..4931ba2 100644 --- a/lib/component/img/img_preview_widget.dart +++ b/lib/component/img/img_preview_widget.dart @@ -1,5 +1,6 @@ import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; +import 'package:vbvs_app/common/util/FitTool.dart'; import '../../common/color/appFontsize.dart'; import '../../controller/mh_controller/apply_repair_controller.dart'; @@ -21,31 +22,20 @@ class ImgPreviewWidget extends GetView { width: MediaQuery.sizeOf(context).width * 0.25, height: MediaQuery.sizeOf(context).height * 0.15, constraints: BoxConstraints( - minHeight: 140, - ), + // minHeight: 140, + ), decoration: BoxDecoration(), child: Column( - mainAxisSize: MainAxisSize.max, + mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: [ - Expanded( - child: Container( - width: MediaQuery.sizeOf(context).width, - height: MediaQuery.sizeOf(context).height * 0.116, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Image.network( - imgUrl, - - // applyRepairController.getPublicUrl(imgUrl), - width: 300, - height: 200, - fit: BoxFit.cover, - ), + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: AspectRatio( + aspectRatio: 1, // 保证宽高比1:1 + child: Image.network( + imgUrl, + fit: BoxFit.cover, ), ), ), @@ -76,3 +66,55 @@ class ImgPreviewWidget extends GetView { ); } } +// class ImgPreviewWidget extends GetView { +// final String imgUrl; +// final int index; +// final ApplyRepairController applyRepairController; +// final bool isDel; + +// ImgPreviewWidget({ +// required this.imgUrl, +// required this.index, +// required this.applyRepairController, +// required this.isDel, +// }); + +// @override +// Widget build(BuildContext context) { +// return Column( +// mainAxisSize: MainAxisSize.min, // 不撑满 ListView 高度 +// children: [ +// // 正方形图片容器 +// AspectRatio( +// aspectRatio: 1, +// child: ClipRRect( +// borderRadius: BorderRadius.circular(8), +// child: Image.network( +// imgUrl, +// fit: BoxFit.cover, +// ), +// ), +// ), +// // 删除按钮 +// if (isDel) +// Padding( +// padding: const EdgeInsets.only(top: 6), +// child: InkWell( +// onTap: () { +// applyRepairController.model.issue_img!.removeAt(index); +// applyRepairController.updateAll(); +// }, +// child: Text( +// '删除', +// style: TextStyle( +// fontFamily: 'Readex Pro', +// color: Color(0xFF9EA4B7), +// fontSize: AppFontsize.small_text_size, +// ), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/component/tool/TopSlideNotification.dart b/lib/component/tool/TopSlideNotification.dart index a46c162..5076c9b 100644 --- a/lib/component/tool/TopSlideNotification.dart +++ b/lib/component/tool/TopSlideNotification.dart @@ -7,6 +7,7 @@ import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; class TopSlideNotification extends StatefulWidget { + BuildContext?context; final String text; double? fontSize = 26.rpx; Color? textColor; diff --git a/lib/controller/date/CalendarController.dart b/lib/controller/date/CalendarController.dart index 0917196..31c7043 100644 --- a/lib/controller/date/CalendarController.dart +++ b/lib/controller/date/CalendarController.dart @@ -1,6 +1,9 @@ import 'package:ef/ef.dart'; class CalendarController extends GetControllerEx { + CalendarController() { + attr = GetModel({}).obs; // 传入一个空Map作为模型 + } Rx displayedMonth = DateTime.now().obs; Rx selectedDate = Rx(null); diff --git a/lib/controller/device/device_share_list_controller.dart b/lib/controller/device/device_share_list_controller.dart index 6463098..c47cc80 100644 --- a/lib/controller/device/device_share_list_controller.dart +++ b/lib/controller/device/device_share_list_controller.dart @@ -15,7 +15,7 @@ part 'device_share_list_controller.g.dart'; // 由json_serializable自动生成 class DeviceShareListModel { String? key; //关键字搜索 int? all = 0; //是否全选 0:不全选 1:全选 - String? accountKey = 'uid';//账户key + String? accountKey = 'uid'; //账户key DeviceShareListModel(); diff --git a/lib/controller/mh_controller/apply_repair_controller.dart b/lib/controller/mh_controller/apply_repair_controller.dart index 578a916..717de26 100644 --- a/lib/controller/mh_controller/apply_repair_controller.dart +++ b/lib/controller/mh_controller/apply_repair_controller.dart @@ -80,9 +80,9 @@ class ApplyRepairController extends GetControllerEx { String serviceApi = ServiceConstant.upload_file; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; - } + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { queryUrl += "&lang=$language"; diff --git a/lib/controller/mh_controller/device_list_controller.dart b/lib/controller/mh_controller/device_list_controller.dart index c214471..22ff648 100644 --- a/lib/controller/mh_controller/device_list_controller.dart +++ b/lib/controller/mh_controller/device_list_controller.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:ui'; import 'package:EasyDartModule/EasyDartModule.dart'; +import 'package:ef/base/http/dio.dart'; import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -49,7 +50,8 @@ class DeviceListController extends GetControllerEx { String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.device_list; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}$search"; - var response = await EasyDartModule.dio.get(queryUrl); + var response = await EasyDartModule.dio + .get(queryUrl); if (response != null) { var responseData = response.data is String ? jsonDecode(response.data) : response.data; diff --git a/lib/controller/mh_controller/issue_controller.dart b/lib/controller/mh_controller/issue_controller.dart index f0fc485..17cff2a 100644 --- a/lib/controller/mh_controller/issue_controller.dart +++ b/lib/controller/mh_controller/issue_controller.dart @@ -27,10 +27,10 @@ class IssueListController extends GetControllerEx { IssueListController() { attr = GetModel(IssueListModel()).obs; } - void onInit() async { - super.onInit(); - await getIssueList(); - } + // void onInit() async { + // super.onInit(); + // await getIssueList(); + // } getIssueList() async { model.isLoading = true; diff --git a/lib/controller/mh_controller/message_controller.dart b/lib/controller/mh_controller/message_controller.dart index d74ec08..be556ca 100644 --- a/lib/controller/mh_controller/message_controller.dart +++ b/lib/controller/mh_controller/message_controller.dart @@ -20,7 +20,7 @@ class MhMessageModel { int? type = 1; //设备类型 1:体征消息 2.系统消息 int? body_message_read = 0; //体征消息 0:已读 1:未读 int? system_message_read = 0; //系统消息 0:已读 1:未读 - + MhMessageModel(); // 从JSON反序列化时的异常处理 @@ -61,8 +61,8 @@ class MhMessageController extends GetControllerEx { String queryUrl = "${serviceAddress}${serviceName}${serviceApi}?type=${messageType}"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { @@ -114,8 +114,8 @@ class MhMessageController extends GetControllerEx { String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { @@ -180,8 +180,8 @@ class MhMessageController extends GetControllerEx { } String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { diff --git a/lib/controller/mh_controller/mhdevice_share_controller.dart b/lib/controller/mh_controller/mhdevice_share_controller.dart index 267c539..a44978b 100644 --- a/lib/controller/mh_controller/mhdevice_share_controller.dart +++ b/lib/controller/mh_controller/mhdevice_share_controller.dart @@ -11,6 +11,7 @@ import 'package:vbvs_app/common/color/app_uri_status.dart'; import 'package:vbvs_app/common/util/DailyLogUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart'; +import 'package:vbvs_app/enum/APPPackageType.dart'; import 'package:vbvs_app/model/api_response.dart'; part 'mhdevice_share_controller.g.dart'; @@ -74,8 +75,14 @@ class MHDeviceShareController extends GetControllerEx { String serviceApi = ServiceConstant.device_share; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (AppConstants().ent_type == APPPackageType.MHT.code) { + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } + } else { + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { @@ -152,8 +159,14 @@ class MHDeviceShareController extends GetControllerEx { String serviceApi = ServiceConstant.device_share; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (AppConstants().ent_type == APPPackageType.MHT.code) { + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } + } else { + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { diff --git a/lib/controller/user_info_controller.dart b/lib/controller/user_info_controller.dart index f36cc3b..0eff726 100644 --- a/lib/controller/user_info_controller.dart +++ b/lib/controller/user_info_controller.dart @@ -104,7 +104,7 @@ class UserInfoController extends GetControllerEx { : response.data; ApiResponse res = ApiResponse.fromJson(responseData, (object) => object); - MyUtils.formatResponse(apiResponse, "上传成功".tr, "头像上传失败".tr); + MyUtils.formatResponse(res, "上传成功".tr, "头像上传失败".tr); model.user!.tmpHead = res.data['path']; updateAll(); return res; diff --git a/lib/language/AppLanguage.dart b/lib/language/AppLanguage.dart index ff0391b..db79e90 100644 --- a/lib/language/AppLanguage.dart +++ b/lib/language/AppLanguage.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:ef/ef.dart'; import 'package:flutter/services.dart'; +import 'package:vbvs_app/enum/APPPackageType.dart'; class AppLanguage extends Translations { // 私有构造函数 @@ -49,14 +50,14 @@ class AppLanguage extends Translations { // } Future loadLanguage(String languageCode, - {String project = 'th'}) async { + {int project = 1}) async { try { final jsonString; // 加载 JSON 文件 - if (project == 'th') { + if (project ==APPPackageType.TH.code ) { jsonString = await rootBundle.loadString('assets/langs/$languageCode.json'); - } else if (project == 'mht') { + } else if (project == APPPackageType.MHT.code) { jsonString = await rootBundle.loadString('assets/mhlangs/$languageCode.json'); } else { diff --git a/lib/main.dart b/lib/main.dart index ab123ce..f64fc14 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,11 +14,14 @@ import 'package:get_storage/get_storage.dart'; import 'package:localstorage/localstorage.dart'; import 'package:syncfusion_localizations/syncfusion_localizations.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/CheckNetwork.dart'; import 'package:vbvs_app/common/util/CommonVariables.dart'; import 'package:vbvs_app/common/util/Dio.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; +import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart'; +import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/date/CalendarController.dart'; import 'package:vbvs_app/controller/device/blueteeth_bind_controller.dart'; import 'package:vbvs_app/controller/device/body_device_controller.dart'; @@ -62,10 +65,12 @@ import 'package:vbvs_app/controller/sleep/sleep_report_controller.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/time/countdown_controller.dart'; import 'package:vbvs_app/controller/weather/weather_controller.dart'; +import 'package:vbvs_app/enum/APPPackageType.dart'; import 'package:vbvs_app/language/AppLanguage.dart'; import 'package:vbvs_app/model/CustomThemeColor.dart'; import 'package:vbvs_app/model/api_response.dart'; import 'package:vbvs_app/model/user_data.dart'; +import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart'; import 'package:vbvs_app/pages/mh_page/MattressControl.dart'; import 'package:vbvs_app/pages/mh_page/device/component/mht_device_calibration_controller.dart'; import 'package:vbvs_app/pages/mh_page/device/controller/mht_bluetooth_controller.dart'; @@ -86,10 +91,10 @@ Future main() async { print('系统语言: ${deviceLocale?.languageCode}'); // final selectapp = "th"; - final selectapp = "mht"; + // final selectapp = "mht"; // await AppLanguage().loadLanguage("en_US"); - await loadLanguageSetting(selectapp); + await loadLanguageSetting(); await initLanguageSetting(); WidgetsFlutterBinding.ensureInitialized(); @@ -102,7 +107,7 @@ Future main() async { await messageStatus(); - startMessagePolling(selectapp); + startMessagePolling(AppConstants().ent_type); // 检查网络 Checknetwork.checkNetwork(); // 微信开放平台注册 @@ -119,12 +124,12 @@ Future main() async { }); } -loadLanguageSetting(String selectapp) async { +loadLanguageSetting() async { await ef.kvdb.openDir("mht"); String? language = await ef.kvdb.read("mht/language"); language ??= 'zh_CN'; - await AppLanguage().loadLanguage(language, project: selectapp); + await AppLanguage().loadLanguage(language, project: APPPackageType.MHT.code); } void initwebService() { @@ -136,11 +141,15 @@ void initwebService() { }); } -initLanguageSetting() { +initLanguageSetting() async { try { + Get.put(MHLanguageController()); + MHLanguageController mhLanguageController = Get.find(); + await mhLanguageController.initLanuageList(); + Get.put(LanguageController()); LanguageController languageController = Get.find(); - languageController.initLanuageList(); + await languageController.initLanuageList(); } catch (e) { print(e); } @@ -175,9 +184,11 @@ Timer? _messageTimer; // } // }); // } -void startMessagePolling(String selectapp) { +void startMessagePolling(int ent_type) { + // Get.put(MhMessageController()); + // MhMessageController messageController = Get.find(); _messageTimer?.cancel(); - if (selectapp == 'mht') { + if (ent_type == APPPackageType.MHT.code) { if (Get.isRegistered()) { Get.find().getMessageStatus(); } @@ -188,7 +199,7 @@ void startMessagePolling(String selectapp) { } _messageTimer = Timer.periodic(Duration(seconds: 10), (timer) async { try { - if (selectapp == 'mht') { + if (ent_type == APPPackageType.MHT.code) { if (Get.isRegistered()) { Get.find().getMessageStatus(); } @@ -393,10 +404,10 @@ class MyApp extends StatelessWidget { Get.lazyPut(() => SleepingHabitController()), Get.lazyPut(() => PeopleInfoController()), Get.lazyPut(() => MainPageController()), - Get.lazyPut(() => MHLanguageController()), + Get.lazyPut(() => MhMessageController()), Get.lazyPut(() => AddressListController()), Get.lazyPut(() => AddressController()), - Get.lazyPut(() => MHLanguageController()), + // Get.lazyPut(() => MHLanguageController()), Get.lazyPut(() => BlueteethBindController()), Get.lazyPut(() => BookInfoController()), Get.lazyPut(() => PersonController()), diff --git a/lib/pages/device_bind/componnet/bind_dialog.dart b/lib/pages/device_bind/componnet/bind_dialog.dart index 61df350..b1be5db 100644 --- a/lib/pages/device_bind/componnet/bind_dialog.dart +++ b/lib/pages/device_bind/componnet/bind_dialog.dart @@ -1288,11 +1288,11 @@ Future showDeleteDeviceConfirmDialog({ style: TextStyle(fontSize: 26.rpx, color: Colors.black87), children: [ TextSpan( - text: '删除后,', + text: '删除后,'.tr, style: TextStyle(color: Colors.red, fontSize: 26.rpx)), TextSpan( - text: '该设备的历史数据将被清除', + text: '该设备的历史数据将被清除'.tr, style: TextStyle(fontSize: 26.rpx), ), ], @@ -1319,7 +1319,7 @@ Future showDeleteDeviceConfirmDialog({ height: 90.rpx, alignment: Alignment.center, child: Text( - '取消', + '取消'.tr, style: TextStyle( fontSize: 26.rpx, color: Colors.white), ), @@ -1340,7 +1340,7 @@ Future showDeleteDeviceConfirmDialog({ height: 90.rpx, alignment: Alignment.center, child: Text( - '删除', + '删除'.tr, style: TextStyle( fontSize: 26.rpx, color: Colors.white), ), @@ -1361,4 +1361,209 @@ Future showDeleteDeviceConfirmDialog({ )); }, ); + + //消息弹窗 +} + +// Future showMessageConfirmDialog({ +// required BuildContext context, +// required VoidCallback onConfirm, +// required VoidCallback onCancel, +// required String title, +// }) async { +// await showDialog( +// context: context, +// barrierDismissible: true, +// builder: (BuildContext context) { +// return FrostedDialog( +// blurSigma: 3.0, +// child: Container( +// width: 520.rpx, +// height: 460.rpx, +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.circular(20.0), +// ), +// child: Padding( +// padding: EdgeInsets.only( +// left: 45.rpx, right: 45.rpx, top: 90.rpx, bottom: 60.rpx), +// child: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// mainAxisSize: MainAxisSize.min, +// children: [ +// Text( +// title, +// style: TextStyle( +// fontSize: 30.rpx, +// color: Colors.black, +// ), +// ), +// const SizedBox(height: 12), +// RichText( +// textAlign: TextAlign.center, +// text: TextSpan( +// style: TextStyle(fontSize: 26.rpx, color: Colors.black87), +// children: [ +// TextSpan( +// text: '有一条新的设备分享消息,'.tr, +// style: +// TextStyle(color: Colors.red, fontSize: 26.rpx)), +// ], +// ), +// ), +// const SizedBox(height: 24), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// CustomCard( +// gradientDirection: GradientDirection.vertical, +// borderRadius: 16.rpx, +// onTap: () { +// Get.back(); +// onCancel(); +// }, +// colors: [ +// Color(0xFF1592AA), +// Color(0XFF0C83A7), +// Color(0XFF006FA3) +// ], +// child: Container( +// width: 200.rpx, +// height: 90.rpx, +// alignment: Alignment.center, +// child: Text( +// '取消'.tr, +// style: TextStyle( +// fontSize: 26.rpx, color: Colors.white), +// ), +// )), +// CustomCard( +// borderRadius: 16.rpx, +// onTap: () { +// Get.back(); +// onConfirm(); +// }, +// colors: [ +// Color(0xFF1592AA), +// Color(0XFF0C83A7), +// Color(0XFF006FA3) +// ], +// child: Container( +// width: 200.rpx, +// height: 90.rpx, +// alignment: Alignment.center, +// child: Text( +// '去查看'.tr, +// style: TextStyle( +// fontSize: 26.rpx, color: Colors.white), +// ), +// )) +// ], +// ) +// ], +// ), +// ), +// )); +// }, +// ); +// } +Future showMessageConfirmDialog({ + required VoidCallback onConfirm, + required VoidCallback onCancel, + required String title, +}) async { + await Get.dialog( + FrostedDialog( + blurSigma: 3.0, + child: Container( + width: 520.rpx, + height: 460.rpx, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20.0), + ), + child: Padding( + padding: EdgeInsets.only( + left: 45.rpx, right: 45.rpx, top: 90.rpx, bottom: 60.rpx), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + style: TextStyle( + fontSize: 30.rpx, + color: Colors.black, + ), + ), + const SizedBox(height: 12), + RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle(fontSize: 26.rpx, color: Colors.black87), + children: [ + TextSpan( + text: '有一条新的设备分享消息,'.tr, + style: TextStyle(color: Colors.red, fontSize: 26.rpx)), + ], + ), + ), + const SizedBox(height: 24), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomCard( + gradientDirection: GradientDirection.vertical, + borderRadius: 16.rpx, + onTap: () { + Get.back(); + onCancel(); + }, + colors: [ + Color(0xFF1592AA), + Color(0XFF0C83A7), + Color(0XFF006FA3) + ], + child: Container( + width: 200.rpx, + height: 90.rpx, + alignment: Alignment.center, + child: Text( + '取消'.tr, + style: TextStyle(fontSize: 26.rpx, color: Colors.white), + ), + ), + ), + CustomCard( + borderRadius: 16.rpx, + onTap: () { + Get.back(); + onConfirm(); + }, + colors: [ + Color(0xFF1592AA), + Color(0XFF0C83A7), + Color(0XFF006FA3) + ], + child: Container( + width: 200.rpx, + height: 90.rpx, + alignment: Alignment.center, + child: Text( + '去查看'.tr, + style: TextStyle(fontSize: 26.rpx, color: Colors.white), + ), + ), + ) + ], + ) + ], + ), + ), + ), + ), + + barrierDismissible: true, + // 监听返回或点击遮罩关闭事件 + ); } diff --git a/lib/pages/main_bottom/component/main_page_b_bottom_change.dart b/lib/pages/main_bottom/component/main_page_b_bottom_change.dart index 37c584e..19fcc50 100644 --- a/lib/pages/main_bottom/component/main_page_b_bottom_change.dart +++ b/lib/pages/main_bottom/component/main_page_b_bottom_change.dart @@ -138,7 +138,6 @@ class _HomePageState extends State DateTime? _lastBackPressedTime; // 记录上一次返回的时间 @override Widget build(BuildContext context) { - return Obx(() { final currentLanguage = languageController.selectLanguage.value; // 监听此变量变化 diff --git a/lib/pages/main_bottom/mine_page.dart b/lib/pages/main_bottom/mine_page.dart index 2de91f9..f57eec7 100644 --- a/lib/pages/main_bottom/mine_page.dart +++ b/lib/pages/main_bottom/mine_page.dart @@ -82,42 +82,7 @@ class _MinePageState extends State { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.end, children: [ - // ClickableContainer( - // backgroundColor: - // Colors.transparent, // 容器背景色 - // highlightColor: themeController - // .currentColor.sc21, // 点击时的背景色 - // padding: EdgeInsets - // .zero, // 这里去掉外部的 padding,避免影响点击范围 - // onTap: () async { - // if (userInfoController.model.login == - // LoginStatus.LOGIN.code) { - // // TopSlideNotification.show( - // // context, - // // text: "待开发功能".tr, - // // ); - // await loginController.openWeChatCustomerService(context); - // } else { - // TopSlideNotification.show( - // context, - // text: "必须登录提示".tr, - // textColor: - // themeController.currentColor.sc9, - // ); - // Get.toNamed("/loginPage"); - // } - // }, - // child: Padding( - // padding: EdgeInsetsDirectional.fromSTEB( - // 0.rpx, 0.rpx, 0.rpx, 0.rpx), - // child: SvgPicture.asset( - // 'assets/img/icon/earphone.svg', - // width: 29.rpx, - // height: 29.rpx, // 如果 SVG 中没有固定颜色,可以这样设置 - // color: themeController.currentColor.sc3, - // ), - // ), - // ), + ClickableContainer( backgroundColor: diff --git a/lib/pages/mh_page/LanguagePage.dart b/lib/pages/mh_page/LanguagePage.dart index 7c83a7f..15a0ec2 100644 --- a/lib/pages/mh_page/LanguagePage.dart +++ b/lib/pages/mh_page/LanguagePage.dart @@ -8,6 +8,7 @@ import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart'; +import 'package:vbvs_app/enum/APPPackageType.dart'; import 'package:vbvs_app/language/AppLanguage.dart'; import 'package:vbvs_app/pages/device_bind/componnet/FancyCircleCheckbox.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart'; @@ -127,7 +128,8 @@ class _LanguagePageState extends State { await AppLanguage() .loadLanguage( language.language_code, - project: "mht"); // 加载语言 + project: AppConstants() + .ent_type); // 加载语言 languageController .updateAll(); // 更新操作 languageController @@ -179,41 +181,43 @@ class _LanguagePageState extends State { false, // 根据 selected 状态显示选中或未选中 onChanged: (value) async { // // 保持原有的状态更改逻辑 - // for (var lang - // in languageController - // .languageList) { - // lang.selected = (lang == - // language); // 更新选中状态 - // } + // 点击事件逻辑 + for (var lang + in languageController + .languageList) { + lang.selected = (lang == + language); // 根据选择更新状态 + } - // await AppLanguage() - // .loadLanguage( - // language - // .language_code, - // project: - // "mht"); // 加载语言 - // languageController - // .updateAll(); // 更新操作 - // languageController - // .selectLanguage - // .value = language; - // final list = - // deviceController - // .personnelList - // .value; - // deviceController - // .getHomeSleeps( - // list[0]["mac"], - // context); - // final box = GetStorage(); - // try { - // box.write( - // 'language', - // language - // .language_code); - // } catch (e) { - // print(e); - // } + await AppLanguage().loadLanguage( + language + .language_code, + project: AppConstants() + .ent_type); // 加载语言 + languageController + .updateAll(); // 更新操作 + languageController + .selectLanguage + .value = language; + final list = + deviceController + .personnelList + .value; + deviceController + .getHomeSleeps( + list[0]["mac"], + context); + + try { + // ef.kv.set("language", + // language.language_code); + ef.kvdb.write( + "mht/language", + language + .language_code); + } catch (e) { + print(e); + } }, ), ].divide(SizedBox( diff --git a/lib/pages/mh_page/ShareDeviceDetailWidget.dart b/lib/pages/mh_page/ShareDeviceDetailWidget.dart index 45a8eb6..f5816fc 100644 --- a/lib/pages/mh_page/ShareDeviceDetailWidget.dart +++ b/lib/pages/mh_page/ShareDeviceDetailWidget.dart @@ -143,6 +143,8 @@ class ShareDeviceDetailWidget extends GetView { } catch (e) { ef.log("[h5]通知列表更新错误:$e"); } + isProgrammaticPop = true; // 设置为程序触发,避免再次触发 PopScope + Get.back(); // 或 Navigator.pop(context); }, onFailure: (res) { TopSlideNotification.show(context, @@ -152,12 +154,12 @@ class ShareDeviceDetailWidget extends GetView { } catch (e) { print(e); } - if (Platform.isAndroid) { - var flag = await _handleBackPressed(context); // 自定义返回逻辑 - if (flag) { - SystemNavigator.pop(); - } - } + // if (Platform.isAndroid) { + // var flag = await _handleBackPressed(context); // 自定义返回逻辑 + // if (flag) { + // SystemNavigator.pop(); + // } + // } }, child: Container( width: MediaQuery.sizeOf(context).width, @@ -423,7 +425,9 @@ class ShareDeviceDetailWidget extends GetView { gradientDirection: GradientDirection.vertical, onTap: () async { deviceListController.unbindShareDevice( - data['info'][5]['uid'], data['mac'.tr], context); + data['info'][5]['uid'], + data['mac'.tr], + context); }, colors: const [ Color(0xFFFCFCFC), @@ -456,20 +460,4 @@ class ShareDeviceDetailWidget extends GetView { ), )); } - - Future _handleBackPressed(BuildContext context) async { - final currentTime = DateTime.now(); - // 如果上次点击返回键时间为空,或者间隔超过 1 秒 - if (_lastBackPressedTime == null || - currentTime.difference(_lastBackPressedTime!) > Duration(seconds: 2)) { - _lastBackPressedTime = currentTime; - TopSlideNotification.show( - context, - text: "再按一次退出程序".tr, - ); - return false; // 阻止退出程序 - } else { - return true; // 允许退出程序 - } - } } diff --git a/lib/pages/mh_page/address_module_widget.dart b/lib/pages/mh_page/address_module_widget.dart index aaa2082..58e4002 100644 --- a/lib/pages/mh_page/address_module_widget.dart +++ b/lib/pages/mh_page/address_module_widget.dart @@ -21,45 +21,47 @@ class AddressModuleWidget extends GetView { child: SlidableAutoCloseBehavior( child: Padding( padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0), - child: Container( - width: MediaQuery.sizeOf(context).width, - constraints: BoxConstraints( - minHeight: 220.rpx, - ), - decoration: BoxDecoration( - color: Color(0xFF003058), - borderRadius: BorderRadius.circular(16), - ), - child: Slidable( - endActionPane: ActionPane( - extentRatio: 0.26, - motion: ScrollMotion(), - children: [ - Expanded( - child: InkWell( - onTap: () async { - await addressListController.deleteAddress( - addressListController.model.addressList[index] - ['_id']); - addressListController.model.addressList.removeAt(index); + child: Slidable( + key: + ValueKey(addressListController.model.addressList[index]['_id']), + endActionPane: ActionPane( + extentRatio: 0.26, + motion: ScrollMotion(), + children: [ + Expanded( + child: InkWell( + onTap: () async { + await addressListController.deleteAddress( + addressListController.model.addressList[index] + ['_id']); + addressListController.model.addressList.removeAt(index); - addressListController.updateAll(); - }, - child: Container( - margin: EdgeInsets.only(left: 30), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: Colors.red, - ), - alignment: Alignment.center, - child: Icon( - Icons.delete, - color: Colors.white, - ), + addressListController.updateAll(); + }, + child: Container( + margin: EdgeInsets.only(left: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.red, + ), + alignment: Alignment.center, + child: Icon( + Icons.delete, + color: Colors.white, ), ), - ) - ], + ), + ) + ], + ), + child: Container( + width: MediaQuery.sizeOf(context).width, + constraints: BoxConstraints( + minHeight: 220.rpx, + ), + decoration: BoxDecoration( + color: Color(0xFF003058), + borderRadius: BorderRadius.circular(16), ), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( diff --git a/lib/pages/mh_page/apply_repair_page.dart b/lib/pages/mh_page/apply_repair_page.dart index 42fef1f..193f5b6 100644 --- a/lib/pages/mh_page/apply_repair_page.dart +++ b/lib/pages/mh_page/apply_repair_page.dart @@ -299,7 +299,6 @@ class ApplyRepairPage extends GetView { .firstWhere((device) => device['mac'.tr].toString() == val); - final mac = selectedDevice['mac'.tr]?.toString() ?? '未知MAC'.tr; @@ -374,12 +373,11 @@ class ApplyRepairPage extends GetView { 0, borderRadius: 8, - margin: const EdgeInsetsDirectional - .fromSTEB( - 10, - 4, - 10, - 4), + margin: EdgeInsetsDirectional.fromSTEB( + 20.rpx, + 8.rpx, + 20.rpx, + 4.rpx), hidesUnderline: true, isOverButton: @@ -418,7 +416,7 @@ class ApplyRepairPage extends GetView { 0.038, constraints: BoxConstraints( - minWidth: 62, + minWidth: 60, ), child: Align( alignment: @@ -457,7 +455,7 @@ class ApplyRepairPage extends GetView { padding: EdgeInsetsDirectional .fromSTEB( - 35.rpx, + 20.rpx, 0, 35.rpx, 0), @@ -493,7 +491,7 @@ class ApplyRepairPage extends GetView { contentPadding: EdgeInsets.all(0), isDense: - true, + false, labelStyle: TextStyle( fontFamily: 'Inter', @@ -595,7 +593,7 @@ class ApplyRepairPage extends GetView { .height * 0.038, constraints: - const BoxConstraints( + BoxConstraints( minWidth: 60, ), child: Align( @@ -634,7 +632,7 @@ class ApplyRepairPage extends GetView { padding: EdgeInsetsDirectional .fromSTEB( - 35.rpx, + 20.rpx, 0, 35.rpx, 0), @@ -670,7 +668,7 @@ class ApplyRepairPage extends GetView { contentPadding: EdgeInsets.all(0), isDense: - true, + false, labelStyle: TextStyle( fontFamily: 'Inter', @@ -812,7 +810,7 @@ class ApplyRepairPage extends GetView { padding: EdgeInsetsDirectional .fromSTEB( - 35.rpx, + 20.rpx, 0, 35.rpx, 0), @@ -848,7 +846,7 @@ class ApplyRepairPage extends GetView { contentPadding: EdgeInsets.all(0), isDense: - true, + false, labelStyle: TextStyle( fontFamily: 'Inter', @@ -1042,8 +1040,8 @@ class ApplyRepairPage extends GetView { ), Flexible( child: Container( - width: 138, - height: 31, + width: 300.rpx, + height: 62.rpx, decoration: BoxDecoration( borderRadius: BorderRadius diff --git a/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart b/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart index 5cfb1ba..7929841 100644 --- a/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart +++ b/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart @@ -141,9 +141,9 @@ class MHTBlueToothController extends GetControllerEx { } String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; - } + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { queryUrl += "&lang=$language"; diff --git a/lib/pages/mh_page/edit_bed.dart b/lib/pages/mh_page/edit_bed.dart index c0be428..af1323b 100644 --- a/lib/pages/mh_page/edit_bed.dart +++ b/lib/pages/mh_page/edit_bed.dart @@ -37,6 +37,11 @@ class _EditBedPageState extends State { super.initState(); editedData = Map.from(widget.data); // 创建副本 _nameController = TextEditingController(text: editedData['name']); + + // 添加监听器 + _nameController.addListener(() { + setState(() {}); // 每次文字变化刷新UI + }); } @override @@ -181,84 +186,178 @@ class _EditBedPageState extends State { height: 193.rpx, ), Padding( - padding: - EdgeInsets.symmetric(horizontal: 60.rpx), - child: Container( - alignment: Alignment.center, - height: bodysize!.maxHeight * 0.076, - decoration: const BoxDecoration( - border: Border( - bottom: BorderSide( - color: Color(0xFF929699), - width: 0))), - child: TextFormField( - // autofocus: true, - controller: _nameController, - obscureText: false, - onChanged: (val) { - editedData['name'] = val; - }, - textAlign: TextAlign.center, - maxLength: AppConstants().text_length, - decoration: InputDecoration( - hintText: "请输入设备的名称".tr, - contentPadding: - const EdgeInsetsDirectional - .fromSTEB(10, 0, 10, 0), - labelStyle: TextStyle( - fontFamily: 'Readex Pro', - letterSpacing: 0, - fontSize: 36.rpx, // 设置输入文字大小 - color: Colors.white, // 设置输入文字颜色 - ), - hintStyle: TextStyle( - fontFamily: 'Readex Pro', - letterSpacing: 0, - color: Color(0xFF929699), - fontSize: 36.rpx, - ), - enabledBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0x00000000), - width: 2, - ), - borderRadius: - BorderRadius.circular(8), - ), - focusedBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0x00000000), - width: 2, - ), - borderRadius: - BorderRadius.circular(8), - ), - errorBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0x00000000), - width: 2, - ), - borderRadius: - BorderRadius.circular(8), - ), - focusedErrorBorder: - UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0x00000000), - width: 2, - ), - borderRadius: - BorderRadius.circular(8), - ), - ), - style: TextStyle( - fontFamily: 'Readex Pro', - letterSpacing: 0, - color: Colors.white, - fontSize: 36.rpx, + padding: + EdgeInsets.symmetric(horizontal: 60.rpx), + child: Container( + alignment: Alignment.center, + height: bodysize!.maxHeight * 0.076, + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide( + color: Color(0xFF929699), // 灰色底部线 + width: 0.5, // 根据需要设置宽度 ), ), - )) + ), + child: Stack( + children: [ + TextFormField( + controller: _nameController, + obscureText: false, + onChanged: (val) { + editedData['name'] = val; + }, + textAlign: TextAlign.center, + textAlignVertical: + TextAlignVertical.center, + maxLength: AppConstants().text_length, + buildCounter: (_, + {int? currentLength, + bool? isFocused, + int? maxLength}) => + null, + decoration: InputDecoration( + hintText: "请输入设备的名称".tr, + contentPadding: + const EdgeInsets.symmetric( + vertical: 0, horizontal: 10), + labelStyle: TextStyle( + fontFamily: 'Readex Pro', + letterSpacing: 0, + fontSize: 36.rpx, + color: Colors.white, + ), + hintStyle: TextStyle( + fontFamily: 'Readex Pro', + letterSpacing: 0, + fontSize: 36.rpx, + color: const Color(0xFF929699), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: + BorderRadius.circular(8), + ), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: + BorderRadius.circular(8), + ), + errorBorder: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: + BorderRadius.circular(8), + ), + focusedErrorBorder: + UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: + BorderRadius.circular(8), + ), + ), + style: TextStyle( + fontFamily: 'Readex Pro', + fontSize: 36.rpx, + color: Colors.white, + letterSpacing: 0, + ), + cursorColor: Colors.white, + ), + + // 自定义右下角计数器 + Positioned( + bottom: 2.rpx, + right: 10.rpx, + child: Text( + '${_nameController.text.characters.length} / ${AppConstants().text_length}', + style: TextStyle( + fontSize: 24.rpx, + color: const Color(0xFF929699), + fontFamily: 'Readex Pro', + ), + ), + ), + ], + ), + ), + + // Container( + // alignment: Alignment.center, + // height: bodysize!.maxHeight * 0.076, + // decoration: const BoxDecoration( + // border: Border( + // bottom: BorderSide( + // color: Color(0xFF929699), + // width: 0))), + // child: TextFormField( + // // autofocus: true, + // controller: _nameController, + // obscureText: false, + // onChanged: (val) { + // editedData['name'] = val; + // }, + // textAlign: TextAlign.center, + // maxLength: AppConstants().text_length, + // decoration: InputDecoration( + // hintText: "请输入设备的名称".tr, + // contentPadding: + // const EdgeInsetsDirectional + // .fromSTEB(10, 0, 10, 0), + // labelStyle: TextStyle( + // fontFamily: 'Readex Pro', + // letterSpacing: 0, + // fontSize: 36.rpx, // 设置输入文字大小 + // color: Colors.white, // 设置输入文字颜色 + // ), + // hintStyle: TextStyle( + // fontFamily: 'Readex Pro', + // letterSpacing: 0, + // color: Color(0xFF929699), + // fontSize: 36.rpx, + // ), + // enabledBorder: UnderlineInputBorder( + // borderSide: const BorderSide( + // color: Color(0x00000000), + // width: 2, + // ), + // borderRadius: + // BorderRadius.circular(8), + // ), + // focusedBorder: UnderlineInputBorder( + // borderSide: const BorderSide( + // color: Color(0x00000000), + // width: 2, + // ), + // borderRadius: + // BorderRadius.circular(8), + // ), + // errorBorder: UnderlineInputBorder( + // borderSide: const BorderSide( + // color: Color(0x00000000), + // width: 2, + // ), + // borderRadius: + // BorderRadius.circular(8), + // ), + // focusedErrorBorder: + // UnderlineInputBorder( + // borderSide: const BorderSide( + // color: Color(0x00000000), + // width: 2, + // ), + // borderRadius: + // BorderRadius.circular(8), + // ), + // ), + // style: TextStyle( + // fontFamily: 'Readex Pro', + // letterSpacing: 0, + // color: Colors.white, + // fontSize: 36.rpx, + // ), + // ), + // ) + ) ], ), ), diff --git a/lib/pages/mh_page/experience_store_widget.dart b/lib/pages/mh_page/experience_store_widget.dart index a11ca9b..88622c3 100644 --- a/lib/pages/mh_page/experience_store_widget.dart +++ b/lib/pages/mh_page/experience_store_widget.dart @@ -37,6 +37,7 @@ class ExperienceStoreWidget extends GetView { ), child: Column( mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( padding: const EdgeInsetsDirectional.fromSTEB(0, 0, 0, 4), diff --git a/lib/pages/mh_page/homepage/controller/mht_home_controller.dart b/lib/pages/mh_page/homepage/controller/mht_home_controller.dart index bb39385..4a1cb1f 100644 --- a/lib/pages/mh_page/homepage/controller/mht_home_controller.dart +++ b/lib/pages/mh_page/homepage/controller/mht_home_controller.dart @@ -61,14 +61,16 @@ class MHTHomeController extends GetControllerEx { Future getDeviceNum() async { try { - ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备.设备列表请求失败".tr); + ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备列表请求失败".tr); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.device_list; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}?bindNum=1"; String? language = ""; - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { queryUrl += "&lang=$language"; @@ -80,7 +82,7 @@ class MHTHomeController extends GetControllerEx { var responseData = response.data is String ? jsonDecode(response.data) : response.data; ApiResponse res = ApiResponse.fromJson(responseData, (object) => object); - MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr); + MyUtils.formatResponse(res, "设备列表请求成功".tr, "设备列表请求失败".tr); if (res.code == HttpStatusCodes.ok) { bindDeviceNum.value = res.total!; updateAll(); @@ -97,7 +99,7 @@ class MHTHomeController extends GetControllerEx { Future getDeviceList( {String? key, String? group, int? bindType}) async { try { - ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备.设备列表请求失败".tr); + ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备列表请求失败".tr); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.device_list; @@ -121,7 +123,9 @@ class MHTHomeController extends GetControllerEx { } String? language = ""; - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; + } if (language != null && language.isNotEmpty) { queryParams['lang'] = language; } @@ -135,7 +139,7 @@ class MHTHomeController extends GetControllerEx { var responseData = response.data is String ? jsonDecode(response.data) : response.data; ApiResponse res = ApiResponse.fromJson(responseData, (object) => object); - MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr); + MyUtils.formatResponse(res, "设备列表请求成功".tr, "设备列表请求失败".tr); if (res.code == HttpStatusCodes.ok) { deviceList.value = res.data!; updateAll(); @@ -152,7 +156,7 @@ class MHTHomeController extends GetControllerEx { Future getDeviceListForWeb( {String? key, String? group, int? bindType}) async { try { - ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备.设备列表请求失败".tr); + ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备列表请求失败".tr); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.device_list; @@ -176,8 +180,8 @@ class MHTHomeController extends GetControllerEx { } String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; } if (language != null && language.isNotEmpty) { queryParams['lang'] = language; @@ -194,14 +198,14 @@ class MHTHomeController extends GetControllerEx { response.data is String ? jsonDecode(response.data) : response.data; ApiResponse res = ApiResponse.fromJson(responseData, (object) => object); - MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr); + MyUtils.formatResponse(res, "设备列表请求成功".tr, "设备列表请求失败".tr); if (res.code == HttpStatusCodes.ok) { deviceListForWeb.value = res.data!; updateAll(); return res; } } else { - return ApiResponse(code: -1, msg: "服务器.失败".tr); + return ApiResponse(code: -1, msg: "失败".tr); } return apiResponse; } catch (e) { @@ -219,8 +223,8 @@ class MHTHomeController extends GetControllerEx { String serviceApi = ServiceConstant.device_bind; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { @@ -355,8 +359,8 @@ class MHTHomeController extends GetControllerEx { String serviceApi = ServiceConstant.device_show; String queryUrl = "$serviceAddress$serviceName$serviceApi"; String? language = ""; - if (languageController.selectLanguage != null) { - language = languageController.selectLanguage.value!.language_code; + if (mhLanguageController.selectLanguage != null) { + language = mhLanguageController.selectLanguage.value!.language_code; } if (language != null && language.isNotEmpty) { if (queryUrl.contains("?")) { @@ -393,7 +397,7 @@ class MHTHomeController extends GetControllerEx { //查询人员信息列表 Future getPersonList() async { - ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备.设备列表请求失败".tr); + ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备列表请求失败".tr); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.personnel_info; diff --git a/lib/pages/mh_page/homepage/new_Home_page.dart b/lib/pages/mh_page/homepage/new_Home_page.dart index 795dc02..938ec61 100644 --- a/lib/pages/mh_page/homepage/new_Home_page.dart +++ b/lib/pages/mh_page/homepage/new_Home_page.dart @@ -204,21 +204,21 @@ class _NewHomePageState extends State { child: userInfo(userInfoController.model.login), ); }), - const Spacer(), // 左右分隔 - FloatingSvgIcon( - assetPath: 'assets/img/icon/xiaoyi.svg', - width: 60.rpx, - height: 60.rpx, - onTap: () { - // print("点击了小鹅图标"); - if (userInfoController.model.login == 0) { - Get.toNamed("/loginPage"); - } - Get.toNamed("/xiaoEPage", - arguments: - "https://xiaoe.he-info.cn/?mac=b43a45c3ddf4"); - }, - ), + // const Spacer(), // 左右分隔 + // FloatingSvgIcon( + // assetPath: 'assets/img/icon/xiaoyi.svg', + // width: 60.rpx, + // height: 60.rpx, + // onTap: () { + // // print("点击了小鹅图标"); + // if (userInfoController.model.login == 0) { + // Get.toNamed("/loginPage"); + // } + // Get.toNamed("/xiaoEPage", + // arguments: + // "https://xiaoe.he-info.cn/?mac=b43a45c3ddf4"); + // }, + // ), SizedBox(width: 40.rpx), ], ), @@ -441,8 +441,8 @@ class _NewHomePageState extends State { deviceController .personnelList.value .map((d) { - var s = d["name"] ?? - d["mac"]; + var s = + d["name"] ?? d["mac"]; if (s == null) { return ""; } else { diff --git a/lib/pages/mh_page/issue_list_page.dart b/lib/pages/mh_page/issue_list_page.dart index 1c56caa..ed2a053 100644 --- a/lib/pages/mh_page/issue_list_page.dart +++ b/lib/pages/mh_page/issue_list_page.dart @@ -12,23 +12,13 @@ class IssueListPage extends GetView { BoxConstraints? bodysize; IssueListController controller = Get.put(IssueListController()); - // ScrollController scrollController = ScrollController(); - // IssueListPage() { - // controller.model.issueList!.clear(); - // controller.initData(); - - // scrollController.addListener(() { - // if (scrollController.position.pixels == - // scrollController.position.maxScrollExtent && - // controller.model.hasMore) { - // controller.initData(); - // controller.updateAll(); - // } - // }); - // } + fetchData() async { + await controller.getIssueList(); + } @override Widget build(BuildContext context) { + fetchData(); return LayoutBuilder(builder: (context, cc) { bodysize = cc; return GestureDetector( diff --git a/lib/pages/mh_page/issue_preview_widget.dart b/lib/pages/mh_page/issue_preview_widget.dart index 7a7b22f..b2ca07a 100644 --- a/lib/pages/mh_page/issue_preview_widget.dart +++ b/lib/pages/mh_page/issue_preview_widget.dart @@ -18,94 +18,80 @@ class IssuePreviewWidget extends GetView { required this.issueListController, }); + + @override Widget build(BuildContext context) { - return InkWell( - onTap: () async { - // issueListController.model.selectedIndex = index; - // issueListController.updateAll(); - // await Future.delayed(Duration(milliseconds: 100)); - // issueListController.model.selectedIndex = -1; - // issueListController.updateAll(); - var article = issueListController.model.issueList![index]; - Get.toNamed("/helpArticle", arguments: article); - // TopSlideNotification.show( - // context, - // text: "功能开发中...", - // ); - }, - child: Obx(() { - return Container( - margin: EdgeInsets.only(left: 30.rpx, right: 30.rpx), - alignment: Alignment.center, - width: double.infinity, - constraints: BoxConstraints( - // minWidth: 100, - minHeight: 119.rpx, - ), - decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(0), - // 整行的背景颜色 - color: index == issueListController.model.selectedIndex - ? Colors.grey[300] - : Colors.transparent, - border: Border( - bottom: BorderSide(color: const Color(0xFF929699), width: 0.rpx), + return Container( + margin: EdgeInsets.only(left: 30.rpx, right: 30.rpx), + child: InkWell( + onTap: () async { + var article = issueListController.model.issueList![index]; + Get.toNamed("/helpArticle", arguments: article); + }, + child: Obx(() { + return Container( + alignment: Alignment.center, + width: double.infinity, + constraints: BoxConstraints(minHeight: 119.rpx), + decoration: BoxDecoration( + color: index == issueListController.model.selectedIndex + ? Colors.grey[300] + : Colors.transparent, + border: Border( + bottom: + BorderSide(color: const Color(0xFF929699), width: 0.rpx), + ), ), - ), - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB(16.rpx, 0, 41.rpx, 0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Flexible( - flex: 9, - child: Align( - alignment: AlignmentDirectional(-1, -1), - child: Text( - issueListController.model.issueList![index]['title'] ?? - '', - style: TextStyle( - fontFamily: 'Readex Pro', - color: Color(0xFFFFFFFF), - fontSize: AppFontsize.title_size, - letterSpacing: 0, - // height: 1, + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.rpx, 0, 41.rpx, 0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Flexible( + flex: 9, + child: Align( + alignment: AlignmentDirectional(-1, -1), + child: Text( + issueListController.model.issueList![index]['title'] ?? + '', + style: TextStyle( + fontFamily: 'Readex Pro', + color: Color(0xFFFFFFFF), + fontSize: AppFontsize.title_size, + letterSpacing: 0, + ), ), ), ), - ), - Expanded( - flex: 1, - child: Align( - alignment: Alignment.centerRight, - child: ClickableContainer( + Expanded( + flex: 1, + child: Align( + alignment: Alignment.centerRight, + child: ClickableContainer( backgroundColor: Colors.transparent, highlightColor: Colors.transparent, padding: EdgeInsets.only(right: 0), onTap: () {}, child: Container( - height: 30.rpx, - width: 30.rpx, - child: SvgPicture.asset( - 'assets/img/icon/expand.svg', - color: Colors.white, - ) - // Icon( - // Icons.arrow_forward_ios, - // color: Colors.white, - // // size: 14.rpx, - // ), - )), + height: 30.rpx, + width: 30.rpx, + child: SvgPicture.asset( + 'assets/img/icon/expand.svg', + color: Colors.white, + ), + ), + ), + ), ), - ), - ], + ], + ), ), - ), - ); - }), + ); + }), + ), ); } } diff --git a/lib/pages/mh_page/message/messageDetail.dart b/lib/pages/mh_page/message/messageDetail.dart index 2aa170c..f99479e 100644 --- a/lib/pages/mh_page/message/messageDetail.dart +++ b/lib/pages/mh_page/message/messageDetail.dart @@ -24,7 +24,7 @@ class MessageDetailPage extends StatefulWidget { class _MessageDetailPageState extends State { MHDeviceShareController controller = Get.find(); MhMessageController messageController = Get.find(); - RxInt status = 0.obs; + RxInt status = 1.obs; @override Widget build(BuildContext context) { status.value = widget.data['status']; @@ -158,7 +158,7 @@ class _MessageDetailPageState extends State { ))), ), const Spacer(), - bottomIcon(context) + bottomIcon(context, messageInfo) ], )), ), @@ -167,7 +167,7 @@ class _MessageDetailPageState extends State { )); } - Container bottomIcon(BuildContext context) { + Container bottomIcon(BuildContext context, var messageInfo) { return Container( height: 120.rpx, decoration: BoxDecoration( @@ -182,8 +182,11 @@ class _MessageDetailPageState extends State { if (apiResponse.code == HttpStatusCodes.ok) { TopSlideNotification.show(context, text: apiResponse.msg!, textColor: Color(0xFF00C1AA)); - messageController.getMessageList(widget.data['type']); - messageController.updateAll(); + messageController.updateMessageReadStatus( + context, messageInfo['type'], + mid: messageInfo['_id']); + // messageController.getMessageList(widget.data['type']); + // messageController.updateAll(); //todo 更新设备列表 MHTHomeController homeController = Get.find(); //更新设备列表 @@ -230,6 +233,7 @@ class _MessageDetailPageState extends State { messageController.getMessageList(widget.data['type']); messageController.updateAll(); } + status.value = 2; } }, child: Obx(() => Text( diff --git a/lib/pages/mh_page/new_mine_page.dart b/lib/pages/mh_page/new_mine_page.dart index 34adb44..9b7f4d2 100644 --- a/lib/pages/mh_page/new_mine_page.dart +++ b/lib/pages/mh_page/new_mine_page.dart @@ -31,43 +31,6 @@ class _MinePageState extends State { UserInfoController userInfoController = Get.find(); ThemeController themeController = Get.find(); MhMessageController messageController = Get.find(); - // final GlobalKey _textKey = GlobalKey(); - - // double _textHalfWidth = 0; - // @override - // void initState() { - // super.initState(); - - // final login = userInfoController.model.login; - // String text; - - // if (login == 0) { - // text = '未命名'.tr; - // } else { - // final nickname = userInfoController.model.user?.nick_name; - // text = (nickname != null && nickname.isNotEmpty) ? nickname : '未命名'.tr; - // } - - // _calculateTextHalfWidth(text); - // } - - // void _calculateTextHalfWidth(String text) { - // final textSpan = TextSpan( - // text: text, - // style: TextStyle( - // fontSize: 30.rpx, - // height: 1, - // ), - // ); - // final textPainter = TextPainter( - // text: textSpan, - // textDirection: ui.TextDirection.ltr, - // ); - // textPainter.layout(); // 计算文本宽度 - // setState(() { - // _textHalfWidth = textPainter.width / 2; - // }); - // } @override Widget build(BuildContext context) { @@ -100,29 +63,35 @@ class _MinePageState extends State { return ClickableContainer( backgroundColor: Colors.transparent, highlightColor: Colors.transparent, - padding: EdgeInsets.only(right: 38.rpx), + padding: EdgeInsets.only(right: 20.rpx), onTap: () { Get.toNamed('/messagePage'); }, child: Stack( clipBehavior: Clip.none, children: [ + // 扩大点击区域但不影响SVG图标尺寸 Container( - height: 42.rpx, - width: 42.rpx, - child: SvgPicture.asset( - 'assets/img/icon/message.svg', - color: Colors.white, + width: 60.rpx, // 比图标大 + height: 60.rpx, + alignment: Alignment.center, + child: Container( + width: 42.rpx, + height: 42.rpx, + child: SvgPicture.asset( + 'assets/img/icon/message.svg', + color: Colors.white, + ), ), ), if (messageController.model.body_message_read == 1 || messageController.model.system_message_read == 1) Positioned( - top: 4.rpx, - right: -10.rpx, + top: 8.rpx, + right: -1.rpx, child: Container( - width: 12.rpx, - height: 12.rpx, + width: 14.rpx, + height: 14.rpx, decoration: BoxDecoration( color: Colors.red, shape: BoxShape.circle, @@ -143,11 +112,12 @@ class _MinePageState extends State { mainAxisSize: MainAxisSize.max, children: [ Padding( - padding: EdgeInsets.only( - top: 30.rpx, left: 60.rpx, bottom: 190.rpx), - child: Row( - children: [ - Container( + padding: EdgeInsets.only( + top: 30.rpx, left: 60.rpx, bottom: 190.rpx), + child: Row( + children: [ + Obx(() { + return Container( width: 120.rpx, height: 120.rpx, clipBehavior: Clip.antiAlias, @@ -172,111 +142,110 @@ class _MinePageState extends State { "assets/images/mine_avatar.png", fit: BoxFit.cover, ), - ), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - login == 1 - ? (userInfoController - .model.user!.nick_name ?? - '未命名'.tr) - : "未命名".tr, - style: TextStyle( - fontFamily: 'Inter', - color: themeController.currentColor.sc3, - fontSize: - AppConstants().title_text_fontSize, - letterSpacing: 0.0, - ), + ); + }), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + login == 1 + ? (userInfoController + .model.user!.nick_name ?? + '未命名'.tr) + : "未命名".tr, + style: TextStyle( + fontFamily: 'Inter', + color: themeController.currentColor.sc3, + fontSize: + AppConstants().title_text_fontSize, + letterSpacing: 0.0, ), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: const Color(0xFF055466), - padding: EdgeInsets.zero, - onTap: () async { - if (userInfoController.model.login == - null || - userInfoController.model.login == - 0) { - TopSlideNotification.show( - context, - text: "必须登录提示".tr, - textColor: themeController - .currentColor.sc9, - ); - Get.toNamed("/loginPage"); - return; - } - await Get.toNamed( - "/editUserInfoPage"); - await userInfoController - .getUserInfo(); - userInfoController.updateAll(); - final login = - userInfoController.model.login; - String text; - - if (login == 0) { - text = '未命名'.tr; - } else { - final nickname = userInfoController - .model.user?.nick_name; - text = (nickname != null && - nickname.isNotEmpty) - ? nickname - : '未命名'.tr; - } - }, - child: Container( - width: 42.rpx, - height: 42.rpx, - alignment: Alignment.center, - child: SvgPicture.asset( - 'assets/images/edit.svg', - color: Colors.white, - width: 18.rpx, - height: 18.rpx, - ), - )), - ].divide(SizedBox( - width: 20.rpx, - )), - ), - Text( - login == 1 - ? (() { - final user = - userInfoController.model.user!; - if (user.email != null && - user.email!.isNotEmpty) { - return user.email!; - } else if (user.phone != null && - user.phone!.isNotEmpty) { - return MyUtils.hidePhoneNumber( - user.phone!); - } else { - return "微信用户".tr; - } - })() - : "未知数据".tr, - style: TextStyle( - fontFamily: 'Inter', - color: themeController.currentColor.sc4, - fontSize: - AppConstants().normal_text_fontSize, - letterSpacing: 0.0, ), + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: const Color(0xFF055466), + padding: EdgeInsets.zero, + onTap: () async { + if (userInfoController.model.login == + null || + userInfoController.model.login == + 0) { + TopSlideNotification.show( + context, + text: "必须登录提示".tr, + textColor: themeController + .currentColor.sc9, + ); + Get.toNamed("/loginPage"); + return; + } + await Get.toNamed("/editUserInfoPage"); + await userInfoController.getUserInfo(); + userInfoController.updateAll(); + final login = + userInfoController.model.login; + String text; + + if (login == 0) { + text = '未命名'.tr; + } else { + final nickname = userInfoController + .model.user?.nick_name; + text = (nickname != null && + nickname.isNotEmpty) + ? nickname + : '未命名'.tr; + } + }, + child: Container( + width: 42.rpx, + height: 42.rpx, + alignment: Alignment.center, + child: SvgPicture.asset( + 'assets/images/edit.svg', + color: Colors.white, + width: 18.rpx, + height: 18.rpx, + ), + )), + ].divide(SizedBox( + width: 20.rpx, + )), + ), + Text( + login == 1 + ? (() { + final user = + userInfoController.model.user!; + if (user.email != null && + user.email!.isNotEmpty) { + return user.email!; + } else if (user.phone != null && + user.phone!.isNotEmpty) { + return MyUtils.hidePhoneNumber( + user.phone!); + } else { + return "微信用户".tr; + } + })() + : "未知数据".tr, + style: TextStyle( + fontFamily: 'Inter', + color: themeController.currentColor.sc4, + fontSize: AppConstants().normal_text_fontSize, + letterSpacing: 0.0, ), - ], - )) - ].divide(SizedBox( - width: 30.rpx, - )), + ), + ], + )) + ].divide(SizedBox( + width: 30.rpx, )), + ), + ), Expanded( child: Container( @@ -304,15 +273,15 @@ class _MinePageState extends State { '当您的智能设备需要报修时,可以通过该功能联系解决,'.tr, path: '/deviceRepairPage', ), - _buildListTile('assets/img/icon/mall.svg', '网上商城'.tr, - '最新的智能产品线上购买服务'.tr, - path: "", onTap: () { + _buildListTile('assets/img/icon/mall.svg', + '网上商城'.tr, '最新的智能产品线上购买服务'.tr, path: "", + onTap: () { JDLauncher.openShop( "https://mall.jd.com/index-14587480.html"); }), - _buildListTile('assets/img/icon/address.svg', - '地址管理'.tr, '用于收货和报修时联系您'.tr, - path: "/addressListPage"), + // _buildListTile('assets/img/icon/address.svg', + // '地址管理'.tr, '用于收货和报修时联系您'.tr, + // path: "/addressListPage"), _buildListTile('assets/img/icon/help.svg', '问题与帮助'.tr, '常见的问题汇总,如:智能床连接流程、如何查看睡眠报告'.tr, path: "/issueListpage"), @@ -474,8 +443,8 @@ class _MinePageState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.rpx)), ), - child: - Text('设置'.tr, style: TextStyle(fontSize: 26.rpx, color: Colors.white)), + child: Text('设置'.tr, + style: TextStyle(fontSize: 26.rpx, color: Colors.white)), ), ); } diff --git a/lib/pages/mh_page/repair_history_page.dart b/lib/pages/mh_page/repair_history_page.dart index c4dcde0..927813c 100644 --- a/lib/pages/mh_page/repair_history_page.dart +++ b/lib/pages/mh_page/repair_history_page.dart @@ -98,7 +98,7 @@ class RepairHistoryListPage extends GetView { ), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( - 34.rpx, 10, 0, 0), + 34.rpx, 10, 0, 35.rpx), child: Container( decoration: const BoxDecoration(), child: Column( @@ -230,23 +230,23 @@ class RepairHistoryListPage extends GetView { Padding( padding: const EdgeInsetsDirectional - .fromSTEB(0, 10, 0, 24), + .fromSTEB(0, 10, 0, 0), child: Container( width: MediaQuery.sizeOf(context) .width, - height: - MediaQuery.sizeOf(context) - .height * - 0.15, + // height: + // MediaQuery.sizeOf(context) + // .height * + // 0.15, constraints: const BoxConstraints( // minHeight: 140, ), child: Container( - width: 100, - height: 100, + width: 90, + height: 90, child: ListView( shrinkWrap: true, scrollDirection: @@ -333,7 +333,8 @@ class RepairHistoryListPage extends GetView { thickness: 1, // 线条厚度 ), endChild: Padding( - padding: const EdgeInsets.all(8.0), + padding: EdgeInsets.only( + left: 10.rpx, top: 2.rpx), child: RepairStatusWidget( data: data['flow'][index]), ), @@ -649,24 +650,36 @@ class RepairHistoryListPage extends GetView { }); } + // List getImage(List imgurl) { + // List images = []; + // ApplyRepairController controller = Get.find(); + // imgurl!.forEach((element) async { + // images.add( + // Container( + // child: ImgPreviewWidget( + // imgUrl: element, + // index: imgurl!.indexOf(element), + // applyRepairController: controller, + // isDel: false, + // ), + // ), + // ); + // }); + // return images; + // } List getImage(List imgurl) { - List images = []; ApplyRepairController controller = Get.find(); - imgurl!.forEach((element) async { - images.add( - Container( - // height: 10, - // width: 10, - - child: ImgPreviewWidget( - imgUrl: element, - index: imgurl!.indexOf(element), - applyRepairController: controller, - isDel: false, - ), + return imgurl.map((element) { + return SizedBox( + width: 90, + height: 90, + child: ImgPreviewWidget( + imgUrl: element, + index: imgurl.indexOf(element), + applyRepairController: controller, + isDel: false, ), ); - }); - return images; + }).toList(); } } diff --git a/lib/pages/mh_page/repair_list.dart b/lib/pages/mh_page/repair_list.dart index 83bdd2e..678e89d 100644 --- a/lib/pages/mh_page/repair_list.dart +++ b/lib/pages/mh_page/repair_list.dart @@ -117,50 +117,107 @@ class DeviceRepairPage extends GetView { ), SizedBox(height: 33.rpx), // 可滚动的正文部分,限定高度 + // Expanded( + // child: SingleChildScrollView( + // child: RichText( + // text: TextSpan( + // style: TextStyle( + // color: Color(0XFF929699), + // fontSize: 26.rpx, + // ), + // children: [ + // TextSpan( + // text: + // "尊敬的用户,感谢您选择我司产品。在使用过程中,如果设备出现故障需要维修,请首先确认设备是否正确连接控制器或网络,检查设置是否正常,排除误操作问题。若问题依然存在,请记录下设备名称、设备编号、和具体故障内容,方便我们快速地为您提供帮助。您可以通过智慧棉花糖APP保修页面直接报修或拨打 " + // .tr, + // style: TextStyle( + // color: Color(0XFF929699), + // fontSize: 26.rpx, + // height: 1.3)), + // TextSpan( + // text: "400-8756-966", + // style: TextStyle( + // color: Colors.white, + // // height: 1.3, + // decoration: TextDecoration + // .underline, // 添加下划线 + // decorationColor: Colors.white, + // decorationThickness: 4.rpx, + // ), + // recognizer: TapGestureRecognizer() + // ..onTap = () { + // MyUtils.makePhoneCall( + // "400-8756-966"); + // }, + // ), + // TextSpan( + // text: " 反馈。".tr, + // style: TextStyle( + // color: Color(0XFF929699), + // fontSize: 26.rpx, + // height: 1.3)), + // ], + // ), + // ), + // ), + // ), Expanded( - child: SingleChildScrollView( - child: RichText( - text: TextSpan( - style: TextStyle( - color: Color(0XFF929699), - fontSize: 26.rpx, - ), - children: [ - TextSpan( + child: Padding( + padding: EdgeInsets.only( + right: 0, + ), + child: Scrollbar( + thumbVisibility: + true, // 滚动时显示滑块,false 时仅在滚动中短暂显示 + thickness: 4.rpx, + child: SingleChildScrollView( + child: RichText( + text: TextSpan( + style: TextStyle( + color: Color(0XFF929699), + fontSize: 26.rpx, + ), + children: [ + TextSpan( text: "尊敬的用户,感谢您选择我司产品。在使用过程中,如果设备出现故障需要维修,请首先确认设备是否正确连接控制器或网络,检查设置是否正常,排除误操作问题。若问题依然存在,请记录下设备名称、设备编号、和具体故障内容,方便我们快速地为您提供帮助。您可以通过智慧棉花糖APP保修页面直接报修或拨打 " .tr, style: TextStyle( - color: Color(0XFF929699), - fontSize: 26.rpx, - height: 1.3)), - TextSpan( - text: "400-8756-966", - style: TextStyle( - color: Colors.white, - // height: 1.3, - decoration: TextDecoration - .underline, // 添加下划线 - decorationColor: Colors.white, - decorationThickness: 4.rpx, + color: Color(0XFF929699), + fontSize: 26.rpx, + height: 1.3, + ), ), - recognizer: TapGestureRecognizer() - ..onTap = () { - MyUtils.makePhoneCall( - "400-8756-966"); - }, - ), - TextSpan( + TextSpan( + text: "400-8756-966", + style: TextStyle( + color: Colors.white, + decoration: + TextDecoration.underline, + decorationColor: Colors.white, + decorationThickness: 4.rpx, + ), + recognizer: + TapGestureRecognizer() + ..onTap = () { + MyUtils.makePhoneCall( + "400-8756-966"); + }, + ), + TextSpan( text: " 反馈。".tr, style: TextStyle( - color: Color(0XFF929699), - fontSize: 26.rpx, - height: 1.3)), - ], + color: Color(0XFF929699), + fontSize: 26.rpx, + height: 1.3, + ), + ), + ], + ), ), ), ), - ), + )) ], ))), SizedBox(height: 24.rpx), diff --git a/lib/pages/mh_page/user/page/edit_userinfo_page.dart b/lib/pages/mh_page/user/page/edit_userinfo_page.dart index 0debb0d..8c307e0 100644 --- a/lib/pages/mh_page/user/page/edit_userinfo_page.dart +++ b/lib/pages/mh_page/user/page/edit_userinfo_page.dart @@ -85,50 +85,7 @@ class _UpdateUserPageState extends State { left: 0.rpx, child: returnIconButtomNew(), ), - Positioned( - right: 20.rpx, - child: CustomCard( - borderRadius: 10.rpx, - onTap: () async { - ApiResponse apiResponse = - await userInfoController.updateData(); - TopSlideNotification.show( - context, - text: apiResponse.msg!, - textColor: apiResponse.code == HttpStatusCodes.ok - ? themeController.currentColor.sc2 - : themeController.currentColor.sc9, - ); - if (apiResponse.code == HttpStatusCodes.ok) { - userInfoController.model.user!.tmpHead = null; - userInfoController.model.user!.tmpNickName = null; - await userInfoController.getUserInfo(); - userInfoController.updateAll(); - Get.back(); - } - }, - colors: [ - stringToColor("FCFCFC"), - stringToColor("CEECE3"), - ], - gradientDirection: GradientDirection.vertical, - child: Container( - width: 100.rpx, - height: 60.rpx, - alignment: Alignment.center, - padding: EdgeInsetsDirectional.fromSTEB( - 16.rpx, 0.rpx, 16.rpx, 0.rpx), - child: Text( - '保存'.tr, - style: TextStyle( - fontFamily: 'Inter Tight', - color: stringToColor("#011D33"), - letterSpacing: 0.0, - fontSize: AppConstants().normal_text_fontSize), - ), - ), - ), - ), + ], ), ), @@ -143,174 +100,258 @@ class _UpdateUserPageState extends State { decoration: BoxDecoration(), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( - 60.rpx, 0.rpx, 60.rpx, 0.rpx), + 30.rpx, 0.rpx, 30.rpx, 0.rpx), child: Column( mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0.rpx, 76.rpx, 0.rpx, 0.rpx), - child: Container( - width: MediaQuery.sizeOf(context).width * 0.213, - height: MediaQuery.sizeOf(context).height * 0.098, - constraints: BoxConstraints( - minWidth: 160.rpx, - minHeight: 160.rpx, + Container( + child: Column( + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.rpx, 76.rpx, 0.rpx, 0.rpx), + child: Container( + width: + MediaQuery.sizeOf(context).width * 0.213, + height: + MediaQuery.sizeOf(context).height * 0.098, + constraints: BoxConstraints( + minWidth: 160.rpx, + minHeight: 160.rpx, + ), + decoration: BoxDecoration(), + child: Obx(() { + return getImageWidget(context); + })), ), - decoration: BoxDecoration(), - child: Obx(() { - return getImageWidget(context); - })), - ), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: themeController.currentColor.sc2, - padding: EdgeInsetsDirectional.fromSTEB( - 0.rpx, 44.rpx, 0.rpx, 44.rpx), - borderRadius: 0, - onTap: () async { - edm.EasyDartModule.logger - .info("${userInfoController.model.user!}点击上传头像"); - DailyLogUtils.writeLog( - "${userInfoController.model.user!}点击上传头像"); - ApiResponse apiResponse = - await userInfoController.uploadImg(); - TopSlideNotification.show( - context, - text: apiResponse.msg!, - textColor: apiResponse.code == HttpStatusCodes.ok - ? themeController.currentColor.sc2 - : themeController.currentColor.sc9, - ); - }, - child: Center( - child: Text( - '点击更换头像'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: stringToColor("#85F5FF"), - ), - ), - ), - ), - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0.rpx, 79.rpx, 0.rpx, 0.rpx), - child: Container( - width: double.infinity, - decoration: BoxDecoration( - border: Border( - top: BorderSide( - color: themeController.currentColor.sc4 - .withOpacity(0.5), - width: AppConstants().border_width, - ), - bottom: BorderSide( - color: themeController.currentColor.sc4 - .withOpacity(0.5), - width: AppConstants().border_width, - ), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - child: Container( - width: 100.rpx, - height: 100.rpx, - decoration: BoxDecoration(), - child: Align( - alignment: AlignmentDirectional(0, 0), - child: TextFormField( - initialValue: userInfoController - .model.user!.nick_name, - onChanged: (value) { - userInfoController.model.user! - .tmpNickName = value; - }, - autofocus: false, - obscureText: false, - decoration: InputDecoration( - isDense: true, - labelStyle: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - ), - hintText: '未命名'.tr, - hintStyle: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc4, - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Color(0x00000000), - width: 1.rpx, - ), - borderRadius: - BorderRadius.circular( - 8.rpx), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Color(0x00000000), - width: 1.rpx, - ), - borderRadius: - BorderRadius.circular( - 8.rpx), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - width: 1.rpx, - ), - borderRadius: - BorderRadius.circular( - 8.rpx), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - width: 1.rpx, - ), - borderRadius: - BorderRadius.circular( - 8.rpx), - ), - filled: false, - ), - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc3, - ), - textAlign: TextAlign.center, - cursorColor: themeController - .currentColor.sc3, - ), - ), - ), + Padding( + padding: EdgeInsets.symmetric( + vertical: 38.rpx), // 保持上下间距 + child: Center( + child: ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: + themeController.currentColor.sc2, + borderRadius: 8.rpx, // 可选,点击反馈更明显 + padding: EdgeInsets.symmetric( + horizontal: 12.rpx, + vertical: 12.rpx), // 控制点击热区大小 + onTap: () async { + edm.EasyDartModule.logger.info( + "${userInfoController.model.user!}点击上传头像"); + DailyLogUtils.writeLog( + "${userInfoController.model.user!}点击上传头像"); + ApiResponse apiResponse = + await userInfoController.uploadImg(); + TopSlideNotification.show( + context, + text: apiResponse.msg!, + textColor: apiResponse.code == + HttpStatusCodes.ok + ? themeController.currentColor.sc2 + : themeController.currentColor.sc9, + ); + }, + child: Text( + '点击更换头像'.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: stringToColor("#85F5FF"), ), - ].divide(SizedBox(width: 27.rpx)), + ), ), ), - ], - ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 30.rpx, 79.rpx, 30.rpx, 0.rpx), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: themeController.currentColor.sc4 + .withOpacity(0.5), + width: AppConstants().border_width, + ), + bottom: BorderSide( + color: themeController.currentColor.sc4 + .withOpacity(0.5), + width: AppConstants().border_width, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Stack( + children: [ + TextFormField( + initialValue: userInfoController + .model.user!.nick_name, + onChanged: (value) { + userInfoController.model.user! + .tmpNickName = value; + }, + maxLength: + AppConstants().text_length, + maxLines: 1, + textAlign: TextAlign.center, + textAlignVertical: + TextAlignVertical.center, + buildCounter: (_, + {int? currentLength, + bool? isFocused, + int? maxLength}) => + null, // 禁用默认计数器 + decoration: InputDecoration( + contentPadding: + EdgeInsets.symmetric( + vertical: 30.rpx), + isDense: true, + hintText: '未命名'.tr, + hintStyle: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + color: themeController + .currentColor.sc4, + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + Colors.transparent, + width: 1.rpx), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + focusedBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + Colors.transparent, + width: 1.rpx), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + errorBorder: + OutlineInputBorder( + borderSide: BorderSide( + width: 1.rpx), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + width: 1.rpx), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + filled: false, + ), + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + color: themeController + .currentColor.sc3, + ), + cursorColor: themeController + .currentColor.sc3, + ), + + // 自定义右下角计数器 + Positioned( + bottom: 4.rpx, + right: 8.rpx, + child: Obx(() { + final text = + userInfoController + .model + .user! + .tmpNickName ?? + ''; + return Text( + '${text.length} / ${AppConstants().text_length}', + style: TextStyle( + fontSize: 20.rpx, + color: Colors.grey, + ), + ); + }), + ), + ], + )), + ].divide(SizedBox(width: 27.rpx)), + ), + ), + ], + ), + ), + ), + ], ), ), + Padding( + padding: EdgeInsets.only( + left: 0.rpx, right: 0.rpx, bottom: 85.rpx), + child: CustomCard( + borderRadius: 10.rpx, + onTap: () async { + ApiResponse apiResponse = + await userInfoController.updateData(); + TopSlideNotification.show( + context, + text: apiResponse.msg!, + textColor: apiResponse.code == HttpStatusCodes.ok + ? themeController.currentColor.sc2 + : themeController.currentColor.sc9, + ); + if (apiResponse.code == HttpStatusCodes.ok) { + userInfoController.model.user!.tmpHead = null; + userInfoController.model.user!.tmpNickName = null; + await userInfoController.getUserInfo(); + userInfoController.updateAll(); + Get.back(); + } + }, + colors: [ + stringToColor("FCFCFC"), + stringToColor("CEECE3"), + ], + gradientDirection: GradientDirection.vertical, + child: Container( + // width: 100.rpx, + height: 90.rpx, + alignment: Alignment.center, + padding: EdgeInsetsDirectional.fromSTEB( + 16.rpx, 0.rpx, 16.rpx, 0.rpx), + child: Text( + '保存'.tr, + style: TextStyle( + fontFamily: 'Inter Tight', + color: stringToColor("#011D33"), + letterSpacing: 0.0, + fontSize: + AppConstants().normal_text_fontSize), + ), + ), + ), + ) ], ), ), diff --git a/lib/pages/sleep_report/component/AIAdviceWidget.dart b/lib/pages/sleep_report/component/AIAdviceWidget.dart index c772116..747f050 100644 --- a/lib/pages/sleep_report/component/AIAdviceWidget.dart +++ b/lib/pages/sleep_report/component/AIAdviceWidget.dart @@ -78,13 +78,20 @@ class _AIAdviceWidgetState extends State { Container( child: Text( // "AI分析介绍".tr, - "AI分析是指利用人工智能技术对用户的睡眠数据进行自动化处理与规律提取,对用户的异常睡眠数据给到一定的辅助决策或者解决问题。".tr, + "AI分析是指利用人工智能技术对用户的睡眠数据进行自动化处理与规律提取,对用户的异常睡眠数据给到一定的辅助决策或者解决问题。" + .tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/BreathePauseNewWidget.dart b/lib/pages/sleep_report/component/BreathePauseNewWidget.dart index 9e7bdc6..8003812 100644 --- a/lib/pages/sleep_report/component/BreathePauseNewWidget.dart +++ b/lib/pages/sleep_report/component/BreathePauseNewWidget.dart @@ -101,10 +101,16 @@ class _SnoreViewWidgetWidgetState extends State { "呼吸暂停监测是指用户在睡眠过程中产生的呼吸暂停的图表说明。", style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/BreatheStandardWidget.dart b/lib/pages/sleep_report/component/BreatheStandardWidget.dart index dc02830..128f1fc 100644 --- a/lib/pages/sleep_report/component/BreatheStandardWidget.dart +++ b/lib/pages/sleep_report/component/BreatheStandardWidget.dart @@ -144,10 +144,16 @@ class _BreatheStandardWidgetState extends State { .tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/CompareSleepWidget.dart b/lib/pages/sleep_report/component/CompareSleepWidget.dart index 2613617..abeb6cd 100644 --- a/lib/pages/sleep_report/component/CompareSleepWidget.dart +++ b/lib/pages/sleep_report/component/CompareSleepWidget.dart @@ -36,172 +36,180 @@ class _CompareSleepWidgetState extends State { @override Widget build(BuildContext context) { - try { - if (widget.sleepReport == null || - widget.sleepReport['yc'] == null || - widget.sleepReport['yc'].isEmpty) { - return Container(); - } - List> data = (widget.sleepReport['yc'] as List) - .map((e) => e as Map) - .toList(); - Map today = {}; - Map yesterday = {}; + try { + if (widget.sleepReport == null || + widget.sleepReport['yc'] == null || + widget.sleepReport['yc'].isEmpty) { + return Container(); + } + List> data = (widget.sleepReport['yc'] as List) + .map((e) => e as Map) + .toList(); + Map today = {}; + Map yesterday = {}; - for (var item in data) { - String typeKey = 'type${item['id']}'; - today[typeKey] = (item['t'] as num).toDouble(); - yesterday[typeKey] = (item['y'] as num).toDouble(); - } - return Container( - width: double.infinity, - decoration: BoxDecoration( - color: themeController.currentColor.sc5, - borderRadius: BorderRadius.circular( - AppConstants().normal_container_radius), // 你可以按需调整圆角半径 - ), - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 45.rpx), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "与昨日对比分析".tr, - style: TextStyle( - color: themeController.currentColor.sc3, - fontSize: AppConstants().title_text_fontSize), - ), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: Colors.white, // 或设置为你需要的水波纹颜色 - padding: EdgeInsetsDirectional.fromSTEB( - 14.rpx, 0.rpx, 14.rpx, 0), // - borderRadius: 0.rpx, // 圆形点击区域 - onTap: () { - showTipDialog( - context, - Container( - child: Text( - // "与昨日对比分析介绍".tr, - "基于时间维度的横向比较分析方法,通过将当前(今日)的数据、状态、行为等与前一日(昨日)的同类信息进行对照,识别差异、趋势或变化规律,查看用户短期时间序列的动态变化。".tr, - style: TextStyle( - fontSize: 26.rpx, - color: themeController.currentColor.sc3, + for (var item in data) { + String typeKey = 'type${item['id']}'; + today[typeKey] = (item['t'] as num).toDouble(); + yesterday[typeKey] = (item['y'] as num).toDouble(); + } + return Container( + width: double.infinity, + decoration: BoxDecoration( + color: themeController.currentColor.sc5, + borderRadius: BorderRadius.circular( + AppConstants().normal_container_radius), // 你可以按需调整圆角半径 + ), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 45.rpx), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "与昨日对比分析".tr, + style: TextStyle( + color: themeController.currentColor.sc3, + fontSize: AppConstants().title_text_fontSize), + ), + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.white, // 或设置为你需要的水波纹颜色 + padding: EdgeInsetsDirectional.fromSTEB( + 14.rpx, 0.rpx, 14.rpx, 0), // + borderRadius: 0.rpx, // 圆形点击区域 + onTap: () { + showTipDialog( + context, + Container( + child: Text( + // "与昨日对比分析介绍".tr, + "基于时间维度的横向比较分析方法,通过将当前(今日)的数据、状态、行为等与前一日(昨日)的同类信息进行对照,识别差异、趋势或变化规律,查看用户短期时间序列的动态变化。" + .tr, + style: TextStyle( + fontSize: 26.rpx, + color: Colors.black, + ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], + ); + }, + child: Container( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部 + width: 28.rpx, + height: 28.rpx, + child: SvgPicture.asset( + 'assets/img/icon/explain.svg', + fit: BoxFit.cover, + color: themeController.currentColor.sc4, ), - ); - }, - child: Container( + ), + ), + ], + ), + ), + SizedBox( + height: 31.rpx, + ), + // Padding( + // padding: + // EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 0.rpx), + // child: SleepRadarChart( + // today: today, + // yesterday: yesterday, + // ), + // ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.rpx, 0.rpx, 30.rpx, 0.rpx), + child: Stack( + children: [ + // 雷达图 + Padding( padding: EdgeInsetsDirectional.fromSTEB( - 0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部 - width: 28.rpx, - height: 28.rpx, - child: SvgPicture.asset( - 'assets/img/icon/explain.svg', - fit: BoxFit.cover, - color: themeController.currentColor.sc4, + 30.rpx, 0.rpx, 0.rpx, 0.rpx), + child: SleepRadarChart( + // today: today, + // yesterday: yesterday, + data: data, ), ), - ), - ], - ), - ), - SizedBox( - height: 31.rpx, - ), - // Padding( - // padding: - // EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 0.rpx), - // child: SleepRadarChart( - // today: today, - // yesterday: yesterday, - // ), - // ), - Padding( - padding: - EdgeInsetsDirectional.fromSTEB(0.rpx, 0.rpx, 30.rpx, 0.rpx), - child: Stack( - children: [ - // 雷达图 - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 30.rpx, 0.rpx, 0.rpx, 0.rpx), - child: SleepRadarChart( - // today: today, - // yesterday: yesterday, - data: data, - ), - ), - // 在左侧添加一个 Text - Positioned( - left: 0, // 这里可以修改文本左边的距离 - top: 0, // 这里可以修改文本顶部的距离 - child: Container( - color: Colors.transparent, // 不需要背景色,可以去掉 - child: Column( - children: [ - Row( - children: [ - // 长条容器 - Container( - width: - 34.rpx, // 你可以设置容器的宽度,或者使用 Expanded 填充剩余空间 - height: 2.rpx, // 容器的高度 - color: stringToColor("#00C1AA"), // 容器的颜色 - ), - SizedBox(width: 13.rpx), // 文字和容器之间的间距 - // 文字 - Text( - '今日数据'.tr, // 文字内容 - style: TextStyle( - fontSize: 18.rpx, // 文字大小 - color: - themeController.currentColor.sc4, // 文字颜色 + // 在左侧添加一个 Text + Positioned( + left: 0, // 这里可以修改文本左边的距离 + top: 0, // 这里可以修改文本顶部的距离 + child: Container( + color: Colors.transparent, // 不需要背景色,可以去掉 + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + // 长条容器 + Container( + width: + 34.rpx, // 你可以设置容器的宽度,或者使用 Expanded 填充剩余空间 + height: 2.rpx, // 容器的高度 + color: stringToColor("#00C1AA"), // 容器的颜色 ), - ), - ], - ), - Row( - children: [ - // 长条容器 - Container( - width: - 34.rpx, // 你可以设置容器的宽度,或者使用 Expanded 填充剩余空间 - height: 2.rpx, // 容器的高度 - color: stringToColor("#FFD251"), // 容器的颜色 - ), - SizedBox(width: 13.rpx), // 文字和容器之间的间距 - // 文字 - Text( - '昨日数据'.tr, // 文字内容 - style: TextStyle( - fontSize: 18.rpx, // 文字大小 - color: - themeController.currentColor.sc4, // 文字颜色 + SizedBox(width: 13.rpx), // 文字和容器之间的间距 + // 文字 + Text( + '今日数据'.tr, // 文字内容 + style: TextStyle( + fontSize: 18.rpx, // 文字大小 + color: themeController + .currentColor.sc4, // 文字颜色 + ), ), - ), - ], - ), - ].divide(SizedBox(height: 25.rpx)), + ], + ), + Row( + children: [ + // 长条容器 + Container( + width: + 34.rpx, // 你可以设置容器的宽度,或者使用 Expanded 填充剩余空间 + height: 2.rpx, // 容器的高度 + color: stringToColor("#FFD251"), // 容器的颜色 + ), + SizedBox(width: 13.rpx), // 文字和容器之间的间距 + // 文字 + Text( + '昨日数据'.tr, // 文字内容 + style: TextStyle( + fontSize: 18.rpx, // 文字大小 + color: themeController + .currentColor.sc4, // 文字颜色 + ), + ), + ], + ), + ].divide(SizedBox(height: 25.rpx)), + ), ), ), - ), - ], + ], + ), ), - ), - ], + ], + ), ), - ), - ); - - } catch (e) { + ); + } catch (e) { es.EasyDartModule.logger.error("打鼾监测绘制异常${e}"); - return Container(); - } + return Container(); + } } } diff --git a/lib/pages/sleep_report/component/DiseasePercentsWidget.dart b/lib/pages/sleep_report/component/DiseasePercentsWidget.dart index 2665647..dcb2198 100644 --- a/lib/pages/sleep_report/component/DiseasePercentsWidget.dart +++ b/lib/pages/sleep_report/component/DiseasePercentsWidget.dart @@ -18,7 +18,6 @@ class DiseasePercentsWidget extends StatefulWidget { } class _DiseasePercentsWidgetState extends State { - @override void setState(VoidCallback callback) { super.setState(callback); @@ -37,89 +36,96 @@ class _DiseasePercentsWidgetState extends State { @override Widget build(BuildContext context) { try { - if (widget.sleepReport == null || - widget.sleepReport['cdri'] == null || - widget.sleepReport['cdri'].isEmpty) { - return Container(); - } - List diseaseData = widget.sleepReport['cdri']; - var showLabel = convertDiseaseData(diseaseData); - return Container( - width: double.infinity, - decoration: BoxDecoration( - color: themeController.currentColor.sc5, - borderRadius: BorderRadius.circular( - AppConstants().normal_container_radius), // 你可以按需调整圆角半径 - ), - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 45.rpx), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "慢性病风险指数".tr, - style: TextStyle( - color: themeController.currentColor.sc3, - fontSize: AppConstants().title_text_fontSize), - ), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: Colors.white, // 或设置为你需要的水波纹颜色 - padding: EdgeInsetsDirectional.fromSTEB( - 14.rpx, 0.rpx, 14.rpx, 0), // - borderRadius: 0.rpx, // 圆形点击区域 - onTap: () { - // 你的点击逻辑 - showTipDialog( - context, - Container( - child: Text( - // "慢性病风险指数介绍".tr, - "慢性病风险指数是通过整合个体的生理指标、生活方式等多维度数据,构建的量化评估模型,用于预测用户未来患慢性非传染性疾病(如高血压、糖尿病、冠心病、癌症等)的风险概率。".tr, - style: TextStyle( - fontSize: 26.rpx, - color: themeController.currentColor.sc3, + if (widget.sleepReport == null || + widget.sleepReport['cdri'] == null || + widget.sleepReport['cdri'].isEmpty) { + return Container(); + } + List diseaseData = widget.sleepReport['cdri']; + var showLabel = convertDiseaseData(diseaseData); + return Container( + width: double.infinity, + decoration: BoxDecoration( + color: themeController.currentColor.sc5, + borderRadius: BorderRadius.circular( + AppConstants().normal_container_radius), // 你可以按需调整圆角半径 + ), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 45.rpx), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "慢性病风险指数".tr, + style: TextStyle( + color: themeController.currentColor.sc3, + fontSize: AppConstants().title_text_fontSize), + ), + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.white, // 或设置为你需要的水波纹颜色 + padding: EdgeInsetsDirectional.fromSTEB( + 14.rpx, 0.rpx, 14.rpx, 0), // + borderRadius: 0.rpx, // 圆形点击区域 + onTap: () { + // 你的点击逻辑 + showTipDialog( + context, + Container( + child: Text( + // "慢性病风险指数介绍".tr, + "慢性病风险指数是通过整合个体的生理指标、生活方式等多维度数据,构建的量化评估模型,用于预测用户未来患慢性非传染性疾病(如高血压、糖尿病、冠心病、癌症等)的风险概率。" + .tr, + style: TextStyle( + fontSize: 26.rpx, + color: Colors.black, + ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], + ); + }, + child: Container( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部 + width: 28.rpx, + height: 28.rpx, + child: SvgPicture.asset( + 'assets/img/icon/explain.svg', + fit: BoxFit.cover, + color: themeController.currentColor.sc4, ), - ); - }, - child: Container( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部 - width: 28.rpx, - height: 28.rpx, - child: SvgPicture.asset( - 'assets/img/icon/explain.svg', - fit: BoxFit.cover, - color: themeController.currentColor.sc4, ), ), - ), - ], + ], + ), ), - ), - SizedBox( - height: 34.rpx, - ), - Container( - child: HorizontalBarChart( - showLabel: showLabel, - showPercent: true, + SizedBox( + height: 34.rpx, ), - ), - ], + Container( + child: HorizontalBarChart( + showLabel: showLabel, + showPercent: true, + ), + ), + ], + ), ), - ), - ); - + ); } catch (e) { - es.EasyDartModule.logger.error("打鼾监测绘制异常${e}"); - return Container(); + es.EasyDartModule.logger.error("打鼾监测绘制异常${e}"); + return Container(); } } diff --git a/lib/pages/sleep_report/component/HeartChangeWidget.dart b/lib/pages/sleep_report/component/HeartChangeWidget.dart index e47959a..0be7459 100644 --- a/lib/pages/sleep_report/component/HeartChangeWidget.dart +++ b/lib/pages/sleep_report/component/HeartChangeWidget.dart @@ -83,10 +83,16 @@ class _HeartChangeWidgetState extends State { "心率变异性(HRV)是指心脏每次跳动间隔时间的差异程度,反映自主神经系统(交感神经和副交感神经)对心脏的调节能力,是评估心血管健康和压力状态的重要指标。".tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/HeartHealthWidget.dart b/lib/pages/sleep_report/component/HeartHealthWidget.dart index 3583f22..f5250ad 100644 --- a/lib/pages/sleep_report/component/HeartHealthWidget.dart +++ b/lib/pages/sleep_report/component/HeartHealthWidget.dart @@ -83,10 +83,16 @@ class _HeartHealthWidgetState extends State { "心率健康评估主要通过用户睡眠报告中的时间点、体征数据及HRV数据等信息,来判断其心理健康水平、疲劳程度。".tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/HeartPointWidget.dart b/lib/pages/sleep_report/component/HeartPointWidget.dart index 67d963d..774983b 100644 --- a/lib/pages/sleep_report/component/HeartPointWidget.dart +++ b/lib/pages/sleep_report/component/HeartPointWidget.dart @@ -97,13 +97,20 @@ class _HeartPointWidgetState extends State { Container( child: Text( // "心率散点图介绍".tr, - "心电散点图是用非线性的图形方法描记的连续心冲击图的RR间期图,因图形由散点组成,又称散点图。".tr, + "心电散点图是用非线性的图形方法描记的连续心冲击图的RR间期图,因图形由散点组成,又称散点图。" + .tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( @@ -151,7 +158,7 @@ class _HeartPointWidgetState extends State { ), ); } catch (e) { - es.EasyDartModule.logger.error("打鼾监测绘制异常${e}"); + es.EasyDartModule.logger.error("打鼾监测绘制异常${e}"); return Container(); } } diff --git a/lib/pages/sleep_report/component/HeartRateStandardWidget.dart b/lib/pages/sleep_report/component/HeartRateStandardWidget.dart index 36be4ca..30966a0 100644 --- a/lib/pages/sleep_report/component/HeartRateStandardWidget.dart +++ b/lib/pages/sleep_report/component/HeartRateStandardWidget.dart @@ -144,10 +144,16 @@ class _HeartRateStandardWidgetState extends State { .tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/SkinPercentWidget.dart b/lib/pages/sleep_report/component/SkinPercentWidget.dart index b6ef67d..434f331 100644 --- a/lib/pages/sleep_report/component/SkinPercentWidget.dart +++ b/lib/pages/sleep_report/component/SkinPercentWidget.dart @@ -100,10 +100,16 @@ class _SkinPercentWidgetState extends State { .tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/SleepView.dart b/lib/pages/sleep_report/component/SleepView.dart index 87ec290..2b26500 100644 --- a/lib/pages/sleep_report/component/SleepView.dart +++ b/lib/pages/sleep_report/component/SleepView.dart @@ -98,13 +98,20 @@ class _SleepViewWidgetState extends State { context, Container( child: Text( - "睡眠规律性是指个体睡眠模式在时间、时长、环境等方面呈现出的稳定性和一致性,是衡量睡眠质量的重要指标之一。".tr, + "睡眠规律性是指个体睡眠模式在时间、时长、环境等方面呈现出的稳定性和一致性,是衡量睡眠质量的重要指标之一。" + .tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/SnoreViewWidget.dart b/lib/pages/sleep_report/component/SnoreViewWidget.dart index cf82ed5..9b05b54 100644 --- a/lib/pages/sleep_report/component/SnoreViewWidget.dart +++ b/lib/pages/sleep_report/component/SnoreViewWidget.dart @@ -131,10 +131,16 @@ class _SnoreViewWidgetWidgetState extends State { "打鼾监测是指用户在睡眠过程中打鼾频次的图表说明。", style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/component/WeekSleepScoreWidget.dart b/lib/pages/sleep_report/component/WeekSleepScoreWidget.dart index 08a94ca..e633d2f 100644 --- a/lib/pages/sleep_report/component/WeekSleepScoreWidget.dart +++ b/lib/pages/sleep_report/component/WeekSleepScoreWidget.dart @@ -108,11 +108,22 @@ class AvgSleepScoreWidget extends StatelessWidget { centerWidget: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text( - mediumLabel.tr, - style: TextStyle( - color: Colors.white, - fontSize: AppConstants().normal_text_fontSize, + // Text( + // mediumLabel.tr, + // style: TextStyle( + // color: Colors.white, + // fontSize: AppConstants().normal_text_fontSize, + // ), + // ), + Padding( + padding: + EdgeInsets.only(top: 12.rpx), // 👈 向下偏移的关键 + child: Text( + mediumLabel.tr, + style: TextStyle( + color: Colors.white, + fontSize: AppConstants().normal_text_fontSize, + ), ), ), Text( diff --git a/lib/pages/sleep_report/component/ZiZhuShenJingPercentWidget.dart b/lib/pages/sleep_report/component/ZiZhuShenJingPercentWidget.dart index a245ccc..260d109 100644 --- a/lib/pages/sleep_report/component/ZiZhuShenJingPercentWidget.dart +++ b/lib/pages/sleep_report/component/ZiZhuShenJingPercentWidget.dart @@ -102,10 +102,16 @@ class _ZiZhuShenJingPercentWidgetState "自主神经平衡指数 是评估人体自主神经系统(ANS)功能状态的重要指标,主要反映交感神经和副交感神经的活性平衡关系。".tr, style: TextStyle( fontSize: 26.rpx, - color: themeController.currentColor.sc3, + color: Colors.black, ), ), ), + backgroundColor: Color(0xFFFFFFFF), + colors: [ + Color(0XFF1592AA), + Color(0xFF0C83A7), + Color(0xFF006FA3) + ], ); }, child: Container( diff --git a/lib/pages/sleep_report/new_sleep_report_page.dart b/lib/pages/sleep_report/new_sleep_report_page.dart index c49f970..0ad5ce5 100644 --- a/lib/pages/sleep_report/new_sleep_report_page.dart +++ b/lib/pages/sleep_report/new_sleep_report_page.dart @@ -52,56 +52,57 @@ class _NewSleepReportPageState extends State { @override void initState() { - if (Get.isRegistered(tag: widget.data["tag"]) == - false) { + super.initState(); + + if (!Get.isRegistered(tag: widget.data["tag"])) { Get.put(tag: widget.data["tag"], SleepReportController()); } sleepReportController = Get.find(tag: widget.data["tag"]); sleepReportController.sleepReport.value = {}; + if (widget.data['date'] == null) { - widget.data['date'] = DateTime.now(); + widget.data['date'] = DateTime.now().millisecondsSinceEpoch; } - calendarController.selectedDate.value = - DateTime.fromMillisecondsSinceEpoch(widget.data['date']); - sleepReportController.selectedDate.value = - DateTime.fromMillisecondsSinceEpoch(widget.data['date']); - if (widget.data['type'] != null) { - sleepReportController.model.type = widget.data['type']; - } else { - sleepReportController.model.type = 1; - } - String date = MyUtils.formatToDate(widget.data['date']); - // String date = '2025-5-27'; - requestWithLog( + + // ✅ 延迟执行赋值逻辑 + WidgetsBinding.instance.addPostFrameCallback((_) { + final selected = DateTime.fromMillisecondsSinceEpoch(widget.data['date']); + + calendarController.selectedDate.value = selected; + sleepReportController.selectedDate.value = selected; + + if (widget.data['type'] != null) { + sleepReportController.model.type = widget.data['type']; + } else { + sleepReportController.model.type = 1; + } + + String date = MyUtils.formatToDate(widget.data['date']); + requestWithLog( logTitle: "查询睡眠报告", method: MyHttpMethod.get, queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${date}&type=${sleepReportController.model.type}", + "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=$date&type=${sleepReportController.model.type}", onSuccess: (res) { - print(res); sleepReportController.sleepReport.value = res.data; sleepReportController.updateAll(); _scrollToTargetComponent(sleepReportController.sleepReport); }, onFailure: (res) { try { - if (MainPageBBottomChange.getCurrentIndex() != null) { - if (MainPageBBottomChange.getCurrentIndex() == 1) { - TopSlideNotification.show(context, - text: res.msg!, - textColor: themeController.currentColor.sc9); - } + if (MainPageBBottomChange.getCurrentIndex() == 1) { + TopSlideNotification.show(context, + text: res.msg!, textColor: themeController.currentColor.sc9); } else { TopSlideNotification.show(context, text: res.msg!, textColor: themeController.currentColor.sc9); } - } catch (e) { - e; - } + } catch (_) {} sleepReportController.sleepReport.value = {}; sleepReportController.updateAll(); - print(res); - }); + }, + ); + }); } @override diff --git a/pubspec.lock b/pubspec.lock index 0fad129..70b0f34 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -453,7 +453,7 @@ packages: description: path: "." ref: main - resolved-ref: e78402ccfdadfa7700d297a929dcb7e32347d2b5 + resolved-ref: "9c4390c05d87832531a94aa8d02059a1e26eb354" url: "https://gitea.wslpc.real.he-info.cn:94/flutter/easyweb.git" source: git version: "0.0.1" @@ -470,7 +470,7 @@ packages: description: path: "." ref: main - resolved-ref: "6f4f561aec070bc0912e6138ea91835e6348a11a" + resolved-ref: "6b0a08903ae91ae57deaa783b2649858867d5eba" url: "https://gitea.wslpc.real.he-info.cn:94/flutter/ef.git" source: git version: "0.0.1" @@ -795,10 +795,10 @@ packages: dependency: "direct main" description: name: fluwx - sha256: "9db31d54043363c9c8283b5f0bc4df982edb45ba19d800df9d7de96a205371ae" + sha256: "46c78b678e2586ad21883dd1b1875b2f4548cf6bf52a388c839fe5d2a6a37e02" url: "https://pub.flutter-io.cn" source: hosted - version: "5.7.0" + version: "5.7.1" font_awesome_flutter: dependency: transitive description: