From 9fe66f0c0c3392f1de260ffdb7315ea16b42efc7 Mon Sep 17 00:00:00 2001
From: wyf <494641114@qq.com>
Date: Fri, 11 Jul 2025 11:07:18 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
assets/img/icon/question.svg | 15 +
.../weather/weather_controller.dart | 190 ++++++++-
lib/main.dart | 3 +-
.../component/main_page_b_bottom_change.dart | 28 +-
.../device/mht_blueteeth_device_page.dart | 366 ++++++++++--------
lib/pages/mh_page/homepage/new_Home_page.dart | 4 +
lib/pages/mh_page/searchWidget.dart | 23 +-
lib/pages/mh_page/test/WebviewTestModel.dart | 19 +-
.../sleep_report/chart/DataShowWidget.dart | 4 +-
.../component/HeartChangeWidget.dart | 4 +-
lib/pages/xiaoe/xiaoe_page.dart | 2 +-
11 files changed, 452 insertions(+), 206 deletions(-)
create mode 100644 assets/img/icon/question.svg
diff --git a/assets/img/icon/question.svg b/assets/img/icon/question.svg
new file mode 100644
index 0000000..5b6e120
--- /dev/null
+++ b/assets/img/icon/question.svg
@@ -0,0 +1,15 @@
+
diff --git a/lib/controller/weather/weather_controller.dart b/lib/controller/weather/weather_controller.dart
index 53ea313..22d50a7 100644
--- a/lib/controller/weather/weather_controller.dart
+++ b/lib/controller/weather/weather_controller.dart
@@ -49,14 +49,19 @@ class WeatherModelController extends GetControllerEx {
@override
Future onInit() async {
super.onInit();
- await _getCurrentLocation();
- _weatherTimer = Timer.periodic(Duration(seconds: 5), (timer) {
- _getCurrentWeather(); // 每 5 秒更新一次天气
- });
- _locationTimer = Timer.periodic(Duration(minutes: 10), (timer) {
- _getCurrentLocation(); // 每 10 分钟更新一次位置
- });
+ try {
+ await _getCurrentLocation();
+ _weatherTimer = Timer.periodic(Duration(seconds: 5), (timer) {
+ _getCurrentWeather(); // 每 5 秒更新一次天气
+ });
+
+ _locationTimer = Timer.periodic(Duration(minutes: 10), (timer) {
+ _getCurrentLocation(); // 每 10 分钟更新一次位置
+ });
+ } catch (e) {
+ ef.log("[天气和定位请求失败]");
+ }
}
@override
@@ -122,7 +127,13 @@ class WeatherModelController extends GetControllerEx {
return Future.error('位置权限被永久拒绝');
}
- return await Geolocator.getCurrentPosition();
+ return await Geolocator.getCurrentPosition(
+ locationSettings: const LocationSettings(
+ accuracy: LocationAccuracy.low, // 使用高精度定位,但不依赖 Google Play
+ distanceFilter: 1000, // 设置最小距离过滤
+ timeLimit: Duration(seconds: 10), // 设置获取位置的最大等待时间
+ ),
+ );
}
// 获取天气信息
@@ -186,3 +197,166 @@ class WeatherModelController extends GetControllerEx {
}
}
}
+
+// import 'dart:async';
+// import 'package:EasyDartModule/EasyDartModule.dart';
+// import 'package:ef/ef.dart';
+// import 'package:amap_flutter_location/amap_flutter_location.dart'; // 导入 amap_flutter_location 插件
+// import 'package:geocoding/geocoding.dart';
+// import 'package:json_annotation/json_annotation.dart';
+// import 'package:vbvs_app/common/util/CommonVariables.dart';
+// import 'package:vbvs_app/controller/setting/language/language_controller.dart';
+// import 'package:weather/weather.dart';
+
+// part 'weather_controller.g.dart';
+
+// @JsonSerializable()
+// class WeatherModel {
+// double? longitude; // 经度
+// double? latitude; // 纬度
+// String? weather_info = ''; // 天气
+// int? current_temperature; // 温度
+// int? min_temperature; // 最低温度
+// int? max_temperature; // 最高温度
+// String? wind_direction; // 风向
+// int? wind_speed; // 风速等级
+// String? cityName; // 城市名
+// String? weatherIcon; // 天气图标
+// String? weatherIconurl; // 天气图标url
+
+// WeatherModel();
+
+// static WeatherModel fromJson(Map json) =>
+// _$WeatherModelFromJson(json);
+
+// Map toJson() => _$WeatherModelToJson(this);
+// }
+
+// class WeatherModelController extends GetControllerEx {
+// LanguageController languageController = Get.find();
+// WeatherModelController() {
+// attr = GetModel(WeatherModel()).obs;
+// weatherFactory = WeatherFactory(CommonVariables.weather_apiKey,
+// language: Language.CHINESE_SIMPLIFIED);
+// }
+
+// Timer? _weatherTimer;
+// Timer? _locationTimer;
+
+// late WeatherFactory weatherFactory;
+// late AMapFlutterLocation location; // 声明 AMapFlutterLocation 实例
+
+// @override
+// Future onInit() async {
+// super.onInit();
+
+// location = AMapFlutterLocation(); // 初始化 AMapFlutterLocation
+
+// try {
+// await _getCurrentLocation();
+// _weatherTimer = Timer.periodic(Duration(seconds: 5), (timer) {
+// _getCurrentWeather(); // 每 5 秒更新一次天气
+// });
+
+// _locationTimer = Timer.periodic(Duration(minutes: 10), (timer) {
+// _getCurrentLocation(); // 每 10 分钟更新一次位置
+// });
+// } catch (e) {
+// ef.log("[天气和定位请求失败]");
+// }
+// }
+
+// @override
+// void onClose() {
+// _weatherTimer?.cancel(); // 取消天气更新定时器
+// _locationTimer?.cancel(); // 取消位置更新定时器
+// location.stopLocation(); // 停止高德定位
+// super.onClose();
+// }
+
+// // 获取当前位置并存储到 model
+// Future _getCurrentLocation() async {
+// try {
+// // 开始定位
+// location.startLocation();
+
+// // 监听定位回调
+
+// location.onLocationChanged().listen((Map result) {
+// ///result即为定位结果
+// ef.log("[位置]:${result}");
+// });
+
+// // location.onLocationChanged.listen((locationData) {
+// // if (locationData.latitude != null && locationData.longitude != null) {
+// // model.latitude = locationData.latitude;
+// // model.longitude = locationData.longitude;
+
+// // // 获取位置对应的城市名
+// // _getCityName(locationData.latitude!, locationData.longitude!);
+// // }
+// // });
+// } catch (e) {
+// print(e);
+// EasyDartModule.logger.error("获取位置失败: $e");
+// }
+// }
+
+// // 获取城市名
+// Future _getCityName(double latitude, double longitude) async {
+// try {
+// List placemarks =
+// await placemarkFromCoordinates(latitude, longitude);
+
+// if (placemarks.isNotEmpty) {
+// model.cityName = placemarks[0].locality ?? "未知数据".tr;
+// }
+// // 获取天气
+// _getCurrentWeather();
+// } catch (e) {
+// print(e);
+// EasyDartModule.logger.error("获取城市名失败: $e");
+// }
+// }
+
+// // 获取天气信息
+// Future _getCurrentWeather() async {
+// if (model.latitude == null || model.longitude == null) {
+// EasyDartModule.logger.error("获取天气失败:位置数据获取失败");
+// return; // 如果位置数据没有获取到,则不更新天气
+// }
+
+// try {
+// weatherFactory.language = Language.CHINESE_SIMPLIFIED;
+// Weather weather = await weatherFactory.currentWeatherByLocation(
+// model.latitude!, model.longitude!);
+
+// model.weather_info = weather.weatherDescription;
+// model.min_temperature = weather.tempMin?.celsius?.toInt();
+// model.max_temperature = weather.tempMax?.celsius?.toInt();
+// model.current_temperature = weather.temperature?.celsius?.toInt();
+// model.wind_speed = weather.windSpeed?.toInt();
+// model.weatherIcon = weather.weatherIcon;
+// if (model.weatherIcon != null) {
+// model.weatherIconurl =
+// "https://openweathermap.org/img/w/${model.weatherIcon}.png";
+// }
+// updateAll(); // 更新 UI
+// } catch (e) {
+// EasyDartModule.logger.error("获取天气失败: $e");
+// print('获取天气失败: $e');
+// }
+// }
+
+// // 获取 5 天天气预报
+// Future> getWeatherForecast(
+// double latitude, double longitude) async {
+// try {
+// return await weatherFactory.fiveDayForecastByLocation(
+// latitude, longitude);
+// } catch (e) {
+// print('获取天气预报失败: $e');
+// rethrow;
+// }
+// }
+// }
diff --git a/lib/main.dart b/lib/main.dart
index 8f9ae53..e9cecc8 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -69,7 +69,6 @@ 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';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
-import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_login_controller.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/update_password_controller.dart';
@@ -81,6 +80,7 @@ import 'routers/routers.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
+
final Locale? deviceLocale = Get.deviceLocale;
print('系统语言: ${deviceLocale?.languageCode}');
@@ -369,7 +369,6 @@ class MyApp extends StatelessWidget {
Get.lazyPut(() => CalendarController()),
Get.lazyPut(() => UserPdfController()),
Get.lazyPut(() => PrivacyPdfController()),
- Get.put(WebviewTestController()),
]));
}
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 398ebc1..31a9169 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
@@ -1,12 +1,17 @@
+import 'dart:convert';
+
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
+import 'package:vbvs_app/common/util/CommonVariables.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
+import 'package:vbvs_app/model/WebSocketMessage.dart';
import 'package:vbvs_app/pages/common/bezier_bottom_navigation_bar.dart';
import 'package:vbvs_app/pages/mh_page/MattressControl.dart';
import 'package:vbvs_app/pages/mh_page/homepage/mht_sleep_report_page.dart';
import 'package:vbvs_app/pages/mh_page/homepage/new_Home_page.dart';
import 'package:vbvs_app/pages/mh_page/new_mine_page.dart';
import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart';
+import 'package:EasyDartModule/EasyDartModule.dart' as edm;
class MainPageBBottomChange extends StatefulWidget {
// 全局 key,用于静态访问 _HomePageState
@@ -138,11 +143,24 @@ class _HomePageState extends State
}
Future dealWebSource(int index) async {
- WebviewTestController webviewTestController = Get.find();
- if (index == 2) {
- await webviewTestController.web.jsbridge?.dart.pageActive(true);
- } else {
- await webviewTestController.web.jsbridge?.dart.pageInActive();
+ try {
+ WebviewTestController webviewTestController = Get.find();
+ if (index == 2) {
+ await webviewTestController.web.jsbridge?.dart.pageActive(true);
+ //激活websocket
+ CommonVariables.callMap["/smartbed/connect"] = (data) {
+ //订阅连接消息
+ ef.log("[设备申请连接]:$data");
+ };
+ edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage(
+ path: "/smartbed/connect",
+ type: 5,
+ data: {"mac": webviewTestController.selectDevice['mac']})));
+ } else {
+ await webviewTestController.web.jsbridge?.dart.pageInActive();
+ }
+ } catch (e) {
+ ef.log("[激活控制页面报错]:$e");
}
}
}
diff --git a/lib/pages/mh_page/device/mht_blueteeth_device_page.dart b/lib/pages/mh_page/device/mht_blueteeth_device_page.dart
index 1155c68..75ffa9f 100644
--- a/lib/pages/mh_page/device/mht_blueteeth_device_page.dart
+++ b/lib/pages/mh_page/device/mht_blueteeth_device_page.dart
@@ -17,6 +17,7 @@ import 'package:vbvs_app/pages/mh_page/component/mht_bind_dialog.dart';
import 'package:vbvs_app/pages/mh_page/device/component/DeviceComponentWidget.dart';
import 'package:vbvs_app/pages/mh_page/device/controller/mht_bluetooth_controller.dart';
import 'package:vbvs_app/pages/mh_page/device/model/BlueToothDataModel.dart';
+import 'package:vbvs_app/pages/mh_page/searchWidget.dart';
class MHTBlueteethDevicePage extends StatefulWidget {
var deviceType;
@@ -146,7 +147,8 @@ class _MHTBlueteethDevicePageState extends State {
final filteredResults = results.where((r) {
final localName = r.advertisementData.localName;
final isTarget = r.rssi > signalThreshold &&
- isTargetDevice(localName, widget.deviceType['reg'].cast());
+ isTargetDevice(
+ localName, widget.deviceType['reg'].cast());
if (!isTarget) return false;
final name = r.advertisementData.advName.toLowerCase();
String macAddress = r.device.remoteId.str;
@@ -336,8 +338,8 @@ class _MHTBlueteethDevicePageState extends State {
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
- stringToColor("FCFCFC"),
- stringToColor("CEECE3")
+ stringToColor("#003058").withOpacity(0.8),
+ stringToColor("#003058").withOpacity(0.8),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
@@ -360,7 +362,7 @@ class _MHTBlueteethDevicePageState extends State {
: '扫描中'.tr,
style: TextStyle(
fontFamily: 'Inter',
- color: stringToColor("#003058"),
+ color: stringToColor("#FFFFFF"),
fontSize: 26.rpx,
letterSpacing: 0.0,
),
@@ -375,8 +377,10 @@ class _MHTBlueteethDevicePageState extends State {
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
- stringToColor("FCFCFC"),
- stringToColor("CEECE3")
+ // stringToColor("FCFCFC"),
+ // stringToColor("CEECE3")
+ Colors.transparent,
+ Colors.transparent,
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
@@ -393,7 +397,7 @@ class _MHTBlueteethDevicePageState extends State {
'最小信号强度'.tr,
style: TextStyle(
fontFamily: 'Inter',
- color: stringToColor("#003058"),
+ color: stringToColor("#FFFFFF"),
fontSize: 26.rpx,
letterSpacing: 0.0,
),
@@ -423,7 +427,7 @@ class _MHTBlueteethDevicePageState extends State {
'${mhtBlueToothController.model.singal!.toInt()}',
style: TextStyle(
fontFamily: 'Inter',
- color: stringToColor("#003058"),
+ color: stringToColor("#FFFFFF"),
fontSize: 26.rpx,
letterSpacing: 0.0,
),
@@ -433,164 +437,194 @@ class _MHTBlueteethDevicePageState extends State {
),
),
),
- Container(
- width: double.infinity,
- decoration: BoxDecoration(
- color: themeController.currentColor.sc3,
- borderRadius: BorderRadius.circular(20.rpx),
- ),
- child: Padding(
- padding: EdgeInsetsDirectional.fromSTEB(
- 35.rpx, 0, 35.rpx, 0),
- child: Row(
- mainAxisSize: MainAxisSize.max,
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Expanded(
- child: Row(
- mainAxisSize: MainAxisSize.max,
- children: [
- Padding(
- padding: EdgeInsetsDirectional.fromSTEB(
- 0, 0.rpx, 0, 0),
- child: Container(
- width: 25.rpx,
- height: 25.rpx,
- decoration: BoxDecoration(),
- child: SvgPicture.asset(
- 'assets/img/icon/query.svg',
- fit: BoxFit.cover,
- color: stringToColor("#333333"),
- ),
- ),
- ),
- Expanded(
- child: Container(
- width: 100.rpx,
- height: 90.rpx,
- decoration: BoxDecoration(
- color: Colors.white,
- ),
- child: Align(
- alignment:
- AlignmentDirectional(-1, 0),
- child: TextFormField(
- initialValue:
- mhtBlueToothController
- .search.value,
- onChanged: (Value) {
- mhtBlueToothController
- .search.value = 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,
- ),
- 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(
- color: Colors.red,
- width: 1.rpx,
- ),
- borderRadius:
- BorderRadius.circular(
- 8.rpx),
- ),
- focusedErrorBorder:
- OutlineInputBorder(
- borderSide: BorderSide(
- color: Colors.red,
- width: 1.rpx,
- ),
- borderRadius:
- BorderRadius.circular(
- 8.rpx),
- ),
- filled: false,
- fillColor: themeController
- .currentColor.sc22,
- ),
- style: TextStyle(
- fontFamily: 'Inter',
- fontSize: 26.rpx,
- letterSpacing: 0.0,
- ),
- cursorColor:
- stringToColor("#003058"),
- ),
- ),
- ),
- ),
- ].divide(SizedBox(width: 6.rpx)),
- ),
- ),
- Padding(
- padding: EdgeInsetsDirectional.fromSTEB(
- 26.rpx, 0, 0, 0),
- child: Row(
- mainAxisSize: MainAxisSize.max,
- children: [
- SizedBox(
- height: 50.rpx,
- child: VerticalDivider(
- thickness: 2.rpx,
- color: stringToColor("#333333"),
- ),
- ),
- ClickableContainer(
- backgroundColor: Colors.transparent,
- highlightColor:
- themeController.currentColor.sc4,
- borderRadius: 6.rpx,
- padding: EdgeInsets.zero,
- onTap: () async {
- _startScanning();
- },
- child: Text(
- '搜索'.tr,
- style: TextStyle(
- fontFamily: 'Inter',
- fontSize: 30.rpx,
- letterSpacing: 0.0,
- color: stringToColor("#333333"),
- ),
- ),
- ),
- ].divide(SizedBox(width: 26.rpx)),
- ),
- ),
- ],
- ),
+ // Container(
+ // width: double.infinity,
+ // decoration: BoxDecoration(
+ // color: themeController.currentColor.sc3,
+ // borderRadius: BorderRadius.circular(20.rpx),
+ // ),
+ // // child: Padding(
+ // // padding: EdgeInsetsDirectional.fromSTEB(
+ // // 35.rpx, 0, 35.rpx, 0),
+ // // child: Row(
+ // // mainAxisSize: MainAxisSize.max,
+ // // mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ // // children: [
+ // // Expanded(
+ // // child: Row(
+ // // mainAxisSize: MainAxisSize.max,
+ // // children: [
+ // // Padding(
+ // // padding: EdgeInsetsDirectional.fromSTEB(
+ // // 0, 0.rpx, 0, 0),
+ // // child: Container(
+ // // width: 25.rpx,
+ // // height: 25.rpx,
+ // // decoration: BoxDecoration(),
+ // // child: SvgPicture.asset(
+ // // 'assets/img/icon/query.svg',
+ // // fit: BoxFit.cover,
+ // // color: stringToColor("#333333"),
+ // // ),
+ // // ),
+ // // ),
+ // // Expanded(
+ // // child: Container(
+ // // width: 100.rpx,
+ // // height: 90.rpx,
+ // // decoration: BoxDecoration(
+ // // color: Colors.white,
+ // // ),
+ // // child: Align(
+ // // alignment:
+ // // AlignmentDirectional(-1, 0),
+ // // child: TextFormField(
+ // // initialValue:
+ // // mhtBlueToothController
+ // // .search.value,
+ // // onChanged: (Value) {
+ // // mhtBlueToothController
+ // // .search.value = 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,
+ // // ),
+ // // 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(
+ // // color: Colors.red,
+ // // width: 1.rpx,
+ // // ),
+ // // borderRadius:
+ // // BorderRadius.circular(
+ // // 8.rpx),
+ // // ),
+ // // focusedErrorBorder:
+ // // OutlineInputBorder(
+ // // borderSide: BorderSide(
+ // // color: Colors.red,
+ // // width: 1.rpx,
+ // // ),
+ // // borderRadius:
+ // // BorderRadius.circular(
+ // // 8.rpx),
+ // // ),
+ // // filled: false,
+ // // fillColor: themeController
+ // // .currentColor.sc22,
+ // // ),
+ // // style: TextStyle(
+ // // fontFamily: 'Inter',
+ // // fontSize: 26.rpx,
+ // // letterSpacing: 0.0,
+ // // ),
+ // // cursorColor:
+ // // stringToColor("#003058"),
+ // // ),
+ // // ),
+ // // ),
+ // // ),
+ // // ].divide(SizedBox(width: 6.rpx)),
+ // // ),
+ // // ),
+ // // Padding(
+ // // padding: EdgeInsetsDirectional.fromSTEB(
+ // // 26.rpx, 0, 0, 0),
+ // // child: Row(
+ // // mainAxisSize: MainAxisSize.max,
+ // // children: [
+ // // SizedBox(
+ // // height: 50.rpx,
+ // // child: VerticalDivider(
+ // // thickness: 2.rpx,
+ // // color: stringToColor("#333333"),
+ // // ),
+ // // ),
+ // // ClickableContainer(
+ // // backgroundColor: Colors.transparent,
+ // // highlightColor:
+ // // themeController.currentColor.sc4,
+ // // borderRadius: 6.rpx,
+ // // padding: EdgeInsets.zero,
+ // // onTap: () async {
+ // // _startScanning();
+ // // },
+ // // child: Text(
+ // // '搜索'.tr,
+ // // style: TextStyle(
+ // // fontFamily: 'Inter',
+ // // fontSize: 30.rpx,
+ // // letterSpacing: 0.0,
+ // // color: stringToColor("#333333"),
+ // // ),
+ // // ),
+ // // ),
+ // // ].divide(SizedBox(width: 26.rpx)),
+ // // ),
+ // // ),
+ // // ],
+ // // ),
+ // // ),
+ // child: Padding(
+ // padding:
+ // EdgeInsetsDirectional.fromSTEB(0, 10, 0, 23),
+ // child: SearchWidget(
+ // keyword: mhtBlueToothController.search.value,
+ // color: Colors.red,
+ // hint: "检索设备",
+ // onChange: (d) {
+ // mhtBlueToothController.search.value = d;
+ // },
+ // findCallback: () {
+ // // controller.getDeviceList();
+ // },
+ // ),
+ // ),
+ // ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
+ child: SearchWidget(
+ padding: EdgeInsets.all(0),
+ keyword: mhtBlueToothController.search.value,
+ color: Colors.red,
+ hint: "检索设备",
+ onChange: (d) {
+ mhtBlueToothController.search.value = d;
+ },
+ findCallback: () {
+ _startScanning();
+ },
),
),
Padding(
diff --git a/lib/pages/mh_page/homepage/new_Home_page.dart b/lib/pages/mh_page/homepage/new_Home_page.dart
index c04c77f..1541314 100644
--- a/lib/pages/mh_page/homepage/new_Home_page.dart
+++ b/lib/pages/mh_page/homepage/new_Home_page.dart
@@ -574,6 +574,8 @@ class _NewHomePageState extends State {
'date': DateTime
.now()
.millisecondsSinceEpoch,
+ 'person_show':
+ false,
},
);
}
@@ -665,6 +667,8 @@ class _NewHomePageState extends State {
'date':
timeMillis,
// 'backgroundColor':stringToColor("#003058"),
+ 'person_show':
+ false,
},
);
},
diff --git a/lib/pages/mh_page/searchWidget.dart b/lib/pages/mh_page/searchWidget.dart
index ad7e729..c71ab6a 100644
--- a/lib/pages/mh_page/searchWidget.dart
+++ b/lib/pages/mh_page/searchWidget.dart
@@ -11,18 +11,21 @@ class SearchWidget extends GetView {
String? hint;
Function? onChange;
Function? findCallback;
+ final EdgeInsetsGeometry? padding; // 新增 padding 参数
- SearchWidget(
- {required this.keyword,
- required this.color,
- this.hint = "请输入关键字",
- this.findCallback,
- this.onChange});
+ SearchWidget({
+ required this.keyword,
+ required this.color,
+ this.hint = "请输入关键字",
+ this.findCallback,
+ this.onChange,
+ this.padding, // 传入 padding 参数
+ });
@override
Widget build(BuildContext context) {
return Padding(
- padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0),
+ padding: padding ?? EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0), // 使用传入的 padding 或默认值
child: Container(
width: double.infinity,
decoration: BoxDecoration(
@@ -42,7 +45,6 @@ class SearchWidget extends GetView {
Container(
width: 25.rpx,
height: 25.rpx,
- // width: double.infinity,
decoration: BoxDecoration(),
child: SvgPicture.asset(
'assets/img/icon/query.svg',
@@ -112,11 +114,6 @@ class SearchWidget extends GetView {
color: Colors.black,
letterSpacing: 0.0,
),
- // cursorColor:
- // FlutterFlowTheme.of(context).primaryText,
- // validator: _model
- // .textControllerValidator
- // .asValidator(context),
onChanged: (d) {
onChange?.call(d);
},
diff --git a/lib/pages/mh_page/test/WebviewTestModel.dart b/lib/pages/mh_page/test/WebviewTestModel.dart
index aaa1737..1de75b0 100644
--- a/lib/pages/mh_page/test/WebviewTestModel.dart
+++ b/lib/pages/mh_page/test/WebviewTestModel.dart
@@ -278,13 +278,18 @@ class WebviewTestController extends GetControllerEx {
class WebviewTestView extends GetComponent {
WebviewTestView({super.key, super.oncreate});
- // @override
- // WebviewTestController newinstance() {
- // if (ef.kvRoot.WebviewTestController == null) {
- // ef.kvRoot.WebviewTestController = WebviewTestController();
- // }
- // return ef.kvRoot.WebviewTestController;
- // }
+ @override
+ WebviewTestController newinstance() {
+ if (ef.kvRoot.WebviewTestController == null) {
+ ef.kvRoot.WebviewTestController = WebviewTestController();
+ if (Get.isRegistered() == false) {
+ Get.put(ef.kvRoot.WebviewTestController);
+ WebviewTestController webviewTestController = Get.find();
+ return webviewTestController;
+ }
+ }
+ return ef.kvRoot.WebviewTestController;
+ }
@override
Widget build(BuildContext context) {
diff --git a/lib/pages/sleep_report/chart/DataShowWidget.dart b/lib/pages/sleep_report/chart/DataShowWidget.dart
index c022d07..7b2349c 100644
--- a/lib/pages/sleep_report/chart/DataShowWidget.dart
+++ b/lib/pages/sleep_report/chart/DataShowWidget.dart
@@ -76,7 +76,7 @@ class _DataShowWidgetState extends State {
),
// 放入传入的 widget3
Container(
- width: MediaQuery.sizeOf(context).width * 0.2, // 固定宽度
+ width: MediaQuery.sizeOf(context).width * 0.25, // 固定宽度
decoration: BoxDecoration(),
child: Align(
alignment: widget.alignment == MainAxisAlignment.start
@@ -89,7 +89,7 @@ class _DataShowWidgetState extends State {
),
// 放入传入的 widget4
Container(
- width: MediaQuery.sizeOf(context).width * 0.15, // 固定宽度
+ width: MediaQuery.sizeOf(context).width * 0.1, // 固定宽度
decoration: BoxDecoration(),
child: Align(
alignment: widget.alignment == MainAxisAlignment.start
diff --git a/lib/pages/sleep_report/component/HeartChangeWidget.dart b/lib/pages/sleep_report/component/HeartChangeWidget.dart
index 13aa542..d36c9a6 100644
--- a/lib/pages/sleep_report/component/HeartChangeWidget.dart
+++ b/lib/pages/sleep_report/component/HeartChangeWidget.dart
@@ -148,7 +148,7 @@ class _HeartChangeWidgetState extends State {
alignment: MainAxisAlignment.center,
widget1: Row(
children: [
- Expanded(
+ Flexible(
child: Text(
'${data['name']}',
maxLines: 1,
@@ -186,7 +186,7 @@ class _HeartChangeWidgetState extends State {
width: 17.rpx,
height: 17.rpx,
child: SvgPicture.asset(
- 'assets/img/icon/explain.svg',
+ 'assets/img/icon/question.svg',
fit: BoxFit.cover,
color: Colors.white,
),
diff --git a/lib/pages/xiaoe/xiaoe_page.dart b/lib/pages/xiaoe/xiaoe_page.dart
index bc94604..4574c0c 100644
--- a/lib/pages/xiaoe/xiaoe_page.dart
+++ b/lib/pages/xiaoe/xiaoe_page.dart
@@ -65,7 +65,7 @@ class _XiaoEPageState extends State {
children: [
/// 居中标题
Text(
- '健康报告'.tr,
+ '小e'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
From 1671e1a4b277026365544e7b10269d701d5c7ebd Mon Sep 17 00:00:00 2001
From: wyf <494641114@qq.com>
Date: Fri, 11 Jul 2025 15:55:59 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/res/mipmap-hdpi/ic_launcherhs.png | Bin 0 -> 188969 bytes
.../main/res/mipmap-ldpi/ic_launcherhs.png | Bin 0 -> 188969 bytes
.../main/res/mipmap-mdpi/ic_launcherhs.png | Bin 0 -> 188969 bytes
.../main/res/mipmap-xhdpi/ic_launcherhs.png | Bin 0 -> 188969 bytes
.../main/res/mipmap-xxhdpi/ic_launcherhs.png | Bin 0 -> 188969 bytes
.../main/res/mipmap-xxxhdpi/ic_launcherhs.png | Bin 0 -> 188969 bytes
android/settings.gradle.kts | 25 ---
assets/img/icon/arrow_right.svg | 10 +-
assets/img/icon/arrow_right1.svg | 1 +
.../home_page/DynamicReportDetailWidget.dart | 18 +-
lib/component/home_page/SleepDateWidget.dart | 4 +-
lib/controller/login/login_controller.dart | 9 +-
lib/main.dart | 1 +
lib/pages/device/instant_body_page.dart | 7 +-
.../device_bind/blueteeth_device_page.dart | 3 +-
lib/pages/login/other_login.dart | 48 +++--
lib/pages/main_bottom/home_page.dart | 198 ++++++++++++------
lib/pages/main_bottom/mine_page.dart | 14 +-
lib/pages/person/person_page.dart | 3 +
lib/pages/repair/apply_repair_page.dart | 109 +++++-----
lib/pages/repair/repair_list_page.dart | 2 +-
21 files changed, 273 insertions(+), 179 deletions(-)
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcherhs.png
create mode 100644 android/app/src/main/res/mipmap-ldpi/ic_launcherhs.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcherhs.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcherhs.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcherhs.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcherhs.png
delete mode 100644 android/settings.gradle.kts
create mode 100644 assets/img/icon/arrow_right1.svg
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcherhs.png b/android/app/src/main/res/mipmap-hdpi/ic_launcherhs.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e93dee3e51bea57ef38f1dc0be529e630102ed7
GIT binary patch
literal 188969
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%0AW~eP8+;
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