体征传感器
This commit is contained in:
@@ -68,7 +68,7 @@
|
|||||||
"检索设备": "检索设备",
|
"检索设备": "检索设备",
|
||||||
"搜索": "搜索",
|
"搜索": "搜索",
|
||||||
"匹配出的外围设备": "匹配出的外围设备",
|
"匹配出的外围设备": "匹配出的外围设备",
|
||||||
"知道了": "知道了",
|
"知道了": "返回",
|
||||||
"蓝牙未开启": "蓝牙未开启",
|
"蓝牙未开启": "蓝牙未开启",
|
||||||
"请先打开蓝牙在进行设备扫描": "请先打开蓝牙在进行设备扫描",
|
"请先打开蓝牙在进行设备扫描": "请先打开蓝牙在进行设备扫描",
|
||||||
"等待扫描": "等待扫描",
|
"等待扫描": "等待扫描",
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
"无法绑定1": "检测到该设备",
|
"无法绑定1": "检测到该设备",
|
||||||
"无法绑定2": "已被绑定",
|
"无法绑定2": "已被绑定",
|
||||||
"无法绑定3": ",绑定前请先进行解绑,有疑问请联系客服",
|
"无法绑定3": ",绑定前请先进行解绑,有疑问请联系客服",
|
||||||
"知道了": "知道了",
|
"知道了": "返回",
|
||||||
"是": "是",
|
"是": "是",
|
||||||
"否": "否",
|
"否": "否",
|
||||||
"确定绑定提示": "确定绑定该设备吗?",
|
"确定绑定提示": "确定绑定该设备吗?",
|
||||||
@@ -208,9 +208,9 @@
|
|||||||
"解除分享": "解除分享",
|
"解除分享": "解除分享",
|
||||||
"最高分": "最高分",
|
"最高分": "最高分",
|
||||||
"最低分": "最低分",
|
"最低分": "最低分",
|
||||||
"本周平均分":"本周平均分",
|
"本周平均分": "本周平均分",
|
||||||
"本月平均分":"本月平均分",
|
"本月平均分": "本月平均分",
|
||||||
"每日得分":"每日得分",
|
"每日得分": "每日得分",
|
||||||
"每日得分介绍":"每日得分介绍",
|
"每日得分介绍": "每日得分介绍",
|
||||||
"与上月对比":"与上月对比"
|
"与上月对比": "与上月对比"
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,6 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:vbvs_app/common/util/CommonVariables.dart';
|
import 'package:vbvs_app/common/util/CommonVariables.dart';
|
||||||
import 'package:vbvs_app/common/util/MyUtils.dart';
|
import 'package:vbvs_app/common/util/MyUtils.dart';
|
||||||
import 'package:vbvs_app/pages/common/selectDialog.dart';
|
|
||||||
import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
|
import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
|
||||||
|
|
||||||
class Checknetwork {
|
class Checknetwork {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ part 'device_list_controller.g.dart';
|
|||||||
class DeviceListModel {
|
class DeviceListModel {
|
||||||
//设备列表
|
//设备列表
|
||||||
List<dynamic> deviceList = [];
|
List<dynamic> deviceList = [];
|
||||||
|
List<dynamic>vitalList=[];
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(ignore: true)
|
||||||
String? keyword;
|
String? keyword;
|
||||||
@@ -35,7 +36,7 @@ class DeviceListController extends GetControllerEx<DeviceListModel> {
|
|||||||
DeviceListController() {
|
DeviceListController() {
|
||||||
attr = GetModel(DeviceListModel()).obs;
|
attr = GetModel(DeviceListModel()).obs;
|
||||||
}
|
}
|
||||||
|
//床和床垫
|
||||||
getDeviceList() async {
|
getDeviceList() async {
|
||||||
try {
|
try {
|
||||||
String search = (model.keyword != null && model.keyword!.isNotEmpty)
|
String search = (model.keyword != null && model.keyword!.isNotEmpty)
|
||||||
@@ -70,6 +71,37 @@ class DeviceListController extends GetControllerEx<DeviceListModel> {
|
|||||||
}
|
}
|
||||||
return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement
|
return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement
|
||||||
}
|
}
|
||||||
|
//体征传感器
|
||||||
|
getVitalList(String mac) async {
|
||||||
|
try {
|
||||||
|
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}?bindType=1&mac=$mac";
|
||||||
|
var response = await EasyDartModule.dio.get(queryUrl);
|
||||||
|
if (response != null) {
|
||||||
|
var responseData =
|
||||||
|
response.data is String ? jsonDecode(response.data) : response.data;
|
||||||
|
ApiResponse res =
|
||||||
|
ApiResponse.fromJson(responseData, (object) => object);
|
||||||
|
MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr);
|
||||||
|
if (res.code == HttpStatusCodes.ok) {
|
||||||
|
// bindDeviceNum.value = res.total!;
|
||||||
|
model.vitalList = res.data;
|
||||||
|
updateAll();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ApiResponse(code: -1, msg: "服务器.失败".tr);
|
||||||
|
}
|
||||||
|
return apiResponse;
|
||||||
|
} catch (e) {
|
||||||
|
EasyDartModule.logger.info("体征传感器请求列表: $e");
|
||||||
|
DailyLogUtils.writeLog("体征传感器请求列表: $e");
|
||||||
|
}
|
||||||
|
return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement
|
||||||
|
}
|
||||||
|
|
||||||
//主动解绑设备
|
//主动解绑设备
|
||||||
Future<String> unbindDevice(Map<dynamic, dynamic> device) async {
|
Future<String> unbindDevice(Map<dynamic, dynamic> device) async {
|
||||||
|
|||||||
@@ -7,9 +7,12 @@ part of 'device_list_controller.dart';
|
|||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
DeviceListModel _$DeviceListModelFromJson(Map<String, dynamic> json) =>
|
DeviceListModel _$DeviceListModelFromJson(Map<String, dynamic> json) =>
|
||||||
DeviceListModel()..deviceList = json['deviceList'] as List<dynamic>;
|
DeviceListModel()
|
||||||
|
..deviceList = json['deviceList'] as List<dynamic>
|
||||||
|
..vitalList = json['vitalList'] as List<dynamic>;
|
||||||
|
|
||||||
Map<String, dynamic> _$DeviceListModelToJson(DeviceListModel instance) =>
|
Map<String, dynamic> _$DeviceListModelToJson(DeviceListModel instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'deviceList': instance.deviceList,
|
'deviceList': instance.deviceList,
|
||||||
|
'vitalList': instance.vitalList,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,10 +25,14 @@ class SleepReportModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class SleepReportController extends GetControllerEx<SleepReportModel> {
|
class SleepReportController extends GetControllerEx<SleepReportModel> {
|
||||||
|
|
||||||
Rx<DateTime?> selectedDate = Rx<DateTime?>(null);
|
Rx<DateTime?> selectedDate = Rx<DateTime?>(null);
|
||||||
RxMap sleepReport = RxMap();
|
RxMap<String, dynamic> sleepReport = <String, dynamic>{}.obs;
|
||||||
|
|
||||||
|
var isLoading = false.obs;
|
||||||
|
|
||||||
|
// 每种类型对应一份数据
|
||||||
|
|
||||||
SleepReportController() {
|
SleepReportController() {
|
||||||
attr = GetModel(SleepReportModel()).obs;
|
attr = GetModel(SleepReportModel()).obs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1017,6 +1017,7 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
|
|||||||
),
|
),
|
||||||
].divide(SizedBox(width: 50.rpx)),
|
].divide(SizedBox(width: 50.rpx)),
|
||||||
),
|
),
|
||||||
|
|
||||||
].divide(SizedBox(width: 34.rpx)),
|
].divide(SizedBox(width: 34.rpx)),
|
||||||
),
|
),
|
||||||
SizedBox(height: 20.rpx),
|
SizedBox(height: 20.rpx),
|
||||||
|
|||||||
@@ -920,6 +920,7 @@ Future<void> showTipDialog(
|
|||||||
BuildContext context,
|
BuildContext context,
|
||||||
Widget widget, {
|
Widget widget, {
|
||||||
Color? backgroundColor,
|
Color? backgroundColor,
|
||||||
|
Co
|
||||||
}) {
|
}) {
|
||||||
ThemeController themeController = Get.find();
|
ThemeController themeController = Get.find();
|
||||||
// BlueteethBindController blueteethBindController = Get.find();
|
// BlueteethBindController blueteethBindController = Get.find();
|
||||||
@@ -998,6 +999,9 @@ Future<void> showTipDialog(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Future<void> showUnBindTipDialog(
|
Future<void> showUnBindTipDialog(
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
Widget widget, {
|
Widget widget, {
|
||||||
|
|||||||
@@ -110,34 +110,33 @@ class _HomePageState extends State<MainPageBBottomChange>
|
|||||||
return Center(child: Text('页面 ${titles[selectedIndex]}'));
|
return Center(child: Text('页面 ${titles[selectedIndex]}'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DateTime? _lastBackPressedTime; // 记录上一次返回的时间
|
DateTime? _lastBackPressedTime; // 记录上一次返回的时间
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return PopScope(
|
return PopScope(
|
||||||
canPop: false,
|
canPop: false,
|
||||||
onPopInvokedWithResult: (disposition, result) async {
|
onPopInvokedWithResult: (disposition, result) async {
|
||||||
if (Platform.isAndroid) {
|
if (Platform.isAndroid) {
|
||||||
var flag = await _handleBackPressed(context); // 自定义返回逻辑
|
var flag = await _handleBackPressed(context); // 自定义返回逻辑
|
||||||
if (flag) {
|
if (flag) {
|
||||||
SystemNavigator.pop();
|
SystemNavigator.pop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
backgroundColor: const Color(0xFF011C33),
|
backgroundColor: const Color(0xFF011C33),
|
||||||
body: IndexedStack(
|
body: IndexedStack(
|
||||||
index: selectedIndex,
|
index: selectedIndex,
|
||||||
children: pages,
|
children: pages,
|
||||||
),
|
),
|
||||||
bottomNavigationBar: BezierBottomNavigationBar(
|
bottomNavigationBar: BezierBottomNavigationBar(
|
||||||
selectedIndex: selectedIndex,
|
selectedIndex: selectedIndex,
|
||||||
animatedPosition: _positionAnimation.value,
|
animatedPosition: _positionAnimation.value,
|
||||||
onTap: _onTabTapped,
|
onTap: _onTabTapped,
|
||||||
path: path,
|
path: path,
|
||||||
titles: titles,
|
titles: titles,
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void switchTab(int index) {
|
void switchTab(int index) {
|
||||||
@@ -243,8 +242,8 @@ class _HomePageState extends State<MainPageBBottomChange>
|
|||||||
ef.log("[激活控制页面报错]:$e");
|
ef.log("[激活控制页面报错]:$e");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _handleBackPressed(BuildContext context) async {
|
Future<bool> _handleBackPressed(BuildContext context) async {
|
||||||
final currentTime = DateTime.now();
|
final currentTime = DateTime.now();
|
||||||
|
|
||||||
// 如果上次点击返回键时间为空,或者间隔超过 1 秒
|
// 如果上次点击返回键时间为空,或者间隔超过 1 秒
|
||||||
|
|||||||
@@ -110,51 +110,60 @@ class LanguagePage extends GetView<MHLanguageController> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildItem(BuildContext context, int index, MHLanguageModel model) {
|
Widget _buildItem(BuildContext context, int index, MHLanguageModel model) {
|
||||||
return Container(
|
return GestureDetector(
|
||||||
// width: bodysize!.maxWidth * 1,
|
onTap: () {
|
||||||
height: bodysize!.maxHeight * 0.055,
|
controller.selectLanguage.value = model;
|
||||||
child: Row(
|
},
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
child: Container(
|
||||||
children: [
|
height: bodysize!.maxHeight * 0.055,
|
||||||
Text(
|
child: Row(
|
||||||
model.language_name ?? "",
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
style: TextStyle(color: Colors.white, fontSize: 30.rpx),
|
children: [
|
||||||
),
|
Text(
|
||||||
Theme(
|
model.language_name ?? "",
|
||||||
data: ThemeData(
|
style: TextStyle(color: Colors.white, fontSize: 30.rpx),
|
||||||
checkboxTheme: CheckboxThemeData(
|
|
||||||
visualDensity: VisualDensity.compact,
|
|
||||||
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(4),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
child: Obx(() {
|
Obx(() {
|
||||||
return Checkbox(
|
double h = 33.rpx;
|
||||||
value: controller.selectLanguage.value?.language_code ==
|
bool check = controller.selectLanguage.value?.language_code ==
|
||||||
model.language_code,
|
model.language_code;
|
||||||
onChanged: (newValue) async {
|
|
||||||
controller.selectLanguage.value = model;
|
return Container(
|
||||||
// if (newValue!) {
|
height: 33.rpx,
|
||||||
// selectLanguage!.value = languageMap[
|
child: AspectRatio(
|
||||||
// text]!; // Set selectLanguage to the current text value
|
aspectRatio: 1,
|
||||||
// } else {
|
child: Center(
|
||||||
// selectLanguage!.value =
|
child: Container(
|
||||||
// ''; // Clear selection if unchecked
|
height: h,
|
||||||
// }
|
width: h,
|
||||||
},
|
decoration: BoxDecoration(
|
||||||
shape: CircleBorder(),
|
borderRadius: BorderRadius.circular(h / 2),
|
||||||
side: BorderSide(
|
border: Border.all(
|
||||||
width: 2,
|
width: check ? 1 : 0.5,
|
||||||
// color: FlutterFlowTheme.of(context).alternate,
|
color: Color(0xFFC8CBD2),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: check
|
||||||
|
? Center(
|
||||||
|
child: ClipOval(
|
||||||
|
child: Container(
|
||||||
|
width: h * 0.6,
|
||||||
|
height: h * 0.6,
|
||||||
|
color: const Color(0xFF6BFDAC),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
activeColor: Color(0XFF6BFDAC),
|
|
||||||
// checkColor: FlutterFlowTheme.of(context).info,
|
|
||||||
);
|
);
|
||||||
})),
|
}),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
)
|
||||||
|
// width: bodysize!.maxWidth * 1,
|
||||||
|
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
487
lib/pages/mh_page/Vital_signs_sensor.dart
Normal file
487
lib/pages/mh_page/Vital_signs_sensor.dart
Normal file
@@ -0,0 +1,487 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:ef/ef.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:flutterflow_ui/flutterflow_ui.dart';
|
||||||
|
import 'package:vbvs_app/common/color/appConstants.dart';
|
||||||
|
import 'package:vbvs_app/common/util/FitTool.dart';
|
||||||
|
import 'package:vbvs_app/common/util/MyUtils.dart';
|
||||||
|
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
|
||||||
|
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
|
||||||
|
import 'package:vbvs_app/controller/mh_controller/device_list_controller.dart';
|
||||||
|
import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
|
||||||
|
|
||||||
|
class VitalSignsSensorPage extends StatefulWidget {
|
||||||
|
Map data;
|
||||||
|
VitalSignsSensorPage({required this.data});
|
||||||
|
@override
|
||||||
|
_VitalSignsSensorState createState() => _VitalSignsSensorState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _VitalSignsSensorState extends State<VitalSignsSensorPage> {
|
||||||
|
BoxConstraints? bodysize;
|
||||||
|
DeviceListController controller = Get.find();
|
||||||
|
Timer? _timer;
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_fetchDeviceList();
|
||||||
|
_timer = Timer.periodic(Duration(seconds: 5), (timer) {
|
||||||
|
_fetchDeviceList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_fetchDeviceList() async {
|
||||||
|
await controller.getVitalList(widget.data['mac']);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_timer?.cancel(); // 页面销毁时取消定时器
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return LayoutBuilder(builder: (context, cc) {
|
||||||
|
bodysize = cc;
|
||||||
|
return GestureDetector(
|
||||||
|
child: Container(
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
image: DecorationImage(
|
||||||
|
image: AssetImage('assets/images/new_background.png'), // 本地图片
|
||||||
|
fit: BoxFit.fill, // 填满整个 Container
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Scaffold(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
appBar: AppBar(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
iconTheme: const IconThemeData(color: Colors.white),
|
||||||
|
automaticallyImplyLeading: false,
|
||||||
|
titleSpacing: 0,
|
||||||
|
title: SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 180.rpx,
|
||||||
|
child: Stack(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
children: [
|
||||||
|
// 中间居中的标题
|
||||||
|
Text(
|
||||||
|
"体征传感器",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 30.rpx,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// 左侧图标
|
||||||
|
Positioned(
|
||||||
|
left: 0.rpx,
|
||||||
|
child: returnIconButtomNew,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
centerTitle: false,
|
||||||
|
),
|
||||||
|
body: SafeArea(
|
||||||
|
child: Obx(() {
|
||||||
|
var list = controller.model.vitalList;
|
||||||
|
return list.isEmpty
|
||||||
|
? const NullDataWidget()
|
||||||
|
: _buildVitalListView(list);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
)));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildVitalListView(List dataList) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 30.rpx),
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
SizedBox(height: 30.rpx),
|
||||||
|
...List.generate(dataList.length, (index) {
|
||||||
|
final item = dataList[index];
|
||||||
|
final title = "体征传感器${index == 0 ? "A" : "B"}"; // ✅ 只处理 A/B 场景
|
||||||
|
return VitalWidget(title: title, data: item);
|
||||||
|
}).divide(SizedBox(height: 30.rpx)),
|
||||||
|
SizedBox(height: 30.rpx),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class VitalWidget extends StatelessWidget {
|
||||||
|
final String title;
|
||||||
|
final Map<String, dynamic> data;
|
||||||
|
|
||||||
|
const VitalWidget({super.key, required this.title, required this.data});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final String id = data['mac'] ?? '--';
|
||||||
|
final int? timestamp = data['create_time'];
|
||||||
|
final String time = (timestamp != null)
|
||||||
|
? DateFormat('yyyy-MM-dd HH:mm')
|
||||||
|
.format(DateTime.fromMillisecondsSinceEpoch(timestamp))
|
||||||
|
: '--';
|
||||||
|
final List<IconData> icons = data['icons'] ?? [];
|
||||||
|
|
||||||
|
return ClickableContainer(
|
||||||
|
backgroundColor: Color(0xFF003058),
|
||||||
|
highlightColor: Color(0xFF055466),
|
||||||
|
borderRadius: 20.rpx,
|
||||||
|
padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 30.rpx, 30.rpx, 40.rpx),
|
||||||
|
onTap: () {},
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
// constraints: BoxConstraints(
|
||||||
|
// minHeight: 60.rpx,
|
||||||
|
// ),
|
||||||
|
child: Align(
|
||||||
|
alignment: AlignmentDirectional(-1, 0),
|
||||||
|
child: Text(
|
||||||
|
// '实时监测结果通知'.tr,
|
||||||
|
title,
|
||||||
|
style: TextStyle(
|
||||||
|
fontFamily: 'Inter',
|
||||||
|
fontSize: 30.rpx,
|
||||||
|
letterSpacing: 0.0,
|
||||||
|
color: themeController.currentColor.sc3,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: MediaQuery.sizeOf(context).width * 0.14,
|
||||||
|
constraints: BoxConstraints(minWidth: 106.rpx),
|
||||||
|
child: Text(
|
||||||
|
"设备ID",
|
||||||
|
style: TextStyle(
|
||||||
|
color: stringToColor("#929699"),
|
||||||
|
fontSize: 26.rpx,
|
||||||
|
),
|
||||||
|
maxLines: 2,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
id,
|
||||||
|
style: TextStyle(fontSize: 26.rpx, color: Color(0xFFFFFFFF)),
|
||||||
|
),
|
||||||
|
].divide(SizedBox(width: 33.rpx)),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: MediaQuery.sizeOf(context).width * 0.14,
|
||||||
|
constraints: BoxConstraints(minWidth: 106.rpx),
|
||||||
|
child: Text(
|
||||||
|
"更新时间",
|
||||||
|
style: TextStyle(
|
||||||
|
color: stringToColor("#929699"),
|
||||||
|
fontSize: 26.rpx,
|
||||||
|
),
|
||||||
|
maxLines: 2,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
time,
|
||||||
|
style: TextStyle(fontSize: 26.rpx, color: Color(0xFFFFFFFF)),
|
||||||
|
),
|
||||||
|
].divide(SizedBox(width: 33.rpx)),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: MediaQuery.sizeOf(context).width * 0.14,
|
||||||
|
constraints: BoxConstraints(minWidth: 106.rpx),
|
||||||
|
child: Text(
|
||||||
|
"设备状态",
|
||||||
|
style: TextStyle(
|
||||||
|
color: stringToColor("#929699"),
|
||||||
|
fontSize: 26.rpx,
|
||||||
|
),
|
||||||
|
maxLines: 2,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
children: [
|
||||||
|
if (data['status']['signal'] != null &&
|
||||||
|
data['status']['signal'] != -1 &&
|
||||||
|
data['status']['status'] != null &&
|
||||||
|
data['status']['status'] == 1)
|
||||||
|
ClickableContainer(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
highlightColor: Colors.grey, // 或根据你主题定制颜色
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
borderRadius: 0,
|
||||||
|
onTap: () {
|
||||||
|
// 点击事件
|
||||||
|
showTipDialog(
|
||||||
|
context,
|
||||||
|
Container(
|
||||||
|
child: RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
text: "信号强度".tr, // 文本前缀部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController.currentColor.sc3,
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: getBedSignal(
|
||||||
|
data['status']['signal']), // 状态部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController
|
||||||
|
.currentColor.sc2, // 同样颜色,也可改成其他颜色
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
child: Container(
|
||||||
|
width: 30.rpx,
|
||||||
|
height: 24.rpx,
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/img/signal${_getSignalLevel(data['status']['signal'])}.png'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (data['status']['inBed'] != null &&
|
||||||
|
data['status']['status'] != null &&
|
||||||
|
data['status']['status'] == 1)
|
||||||
|
ClickableContainer(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
highlightColor: Colors.grey,
|
||||||
|
padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0),
|
||||||
|
borderRadius: 0,
|
||||||
|
onTap: () {
|
||||||
|
showTipDialog(
|
||||||
|
context,
|
||||||
|
Container(
|
||||||
|
child: RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
text: "是否在床".tr, // 文本前缀部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController.currentColor.sc3,
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: getBedStatus(
|
||||||
|
data['status']['inBed']), // 状态部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController
|
||||||
|
.currentColor.sc2, // 同样颜色,也可改成其他颜色
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
width: 16.rpx,
|
||||||
|
height: 36.rpx,
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
data['status']['inBed'] == 0
|
||||||
|
? 'assets/img/icon/not_bed.svg'
|
||||||
|
: 'assets/img/icon/in_bed.svg',
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (data['status']['failure'] != 0 &&
|
||||||
|
data['status']['status'] != null &&
|
||||||
|
data['status']['status'] == 1)
|
||||||
|
ClickableContainer(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
highlightColor: Colors.grey, // 可自定义点击水波纹颜色
|
||||||
|
padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0),
|
||||||
|
borderRadius: 0,
|
||||||
|
onTap: () {
|
||||||
|
showTipDialog(
|
||||||
|
context,
|
||||||
|
Container(
|
||||||
|
child: RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
text: "设备故障".tr, // 文本前缀部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController.currentColor.sc9,
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
// TextSpan(
|
||||||
|
// text:widget
|
||||||
|
// .device['status']['status'] == 1?"在线".tr:"离线".tr, // 状态部分
|
||||||
|
// style: TextStyle(
|
||||||
|
// color: themeController.currentColor
|
||||||
|
// .sc2, // 同样颜色,也可改成其他颜色
|
||||||
|
// fontSize: AppConstants()
|
||||||
|
// .title_text_fontSize,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
width: 27.rpx,
|
||||||
|
height: 27.rpx,
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
'assets/img/icon/device_issue.svg',
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (data['status']['upgrade'] != 0 &&
|
||||||
|
data['status']['status'] != null &&
|
||||||
|
data['status']['status'] == 1)
|
||||||
|
ClickableContainer(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
highlightColor: Colors.grey, // 可自定义点击效果颜色
|
||||||
|
padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0),
|
||||||
|
borderRadius: 0,
|
||||||
|
onTap: () {
|
||||||
|
//todo 升级
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
width: 34.rpx,
|
||||||
|
height: 24.rpx,
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
'assets/img/icon/upgrade.svg',
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
// color: themeController.currentColor.sc3, // 若你想加颜色控制可取消注释
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (data['status']['status'] != null &&
|
||||||
|
data['status']['status'] == 0)
|
||||||
|
ClickableContainer(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
highlightColor: Colors.grey, // 可替换为点击高亮色
|
||||||
|
padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0),
|
||||||
|
borderRadius: 0,
|
||||||
|
onTap: () {
|
||||||
|
showTipDialog(
|
||||||
|
context,
|
||||||
|
Container(
|
||||||
|
child: RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
text: "网络状态".tr, // 文本前缀部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController.currentColor.sc3,
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: data['status']['status'] == 1
|
||||||
|
? "在线".tr
|
||||||
|
: "离线".tr, // 状态部分
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeController
|
||||||
|
.currentColor.sc2, // 同样颜色,也可改成其他颜色
|
||||||
|
fontSize:
|
||||||
|
AppConstants().title_text_fontSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
width: 27.rpx,
|
||||||
|
height: 27.rpx,
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
// data['status']['status'] == 1
|
||||||
|
// ? 'assets/img/icon/device_online.svg'
|
||||||
|
// : 'assets/img/icon/device_offline.svg',
|
||||||
|
'assets/img/icon/device_issue.svg',
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
].divide(SizedBox(width: 50.rpx)),
|
||||||
|
),
|
||||||
|
].divide(SizedBox(width: 34.rpx)),
|
||||||
|
),
|
||||||
|
].divide(
|
||||||
|
SizedBox(height: 20.rpx),
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
getBedSignal(signal) {
|
||||||
|
if (signal <= 1) {
|
||||||
|
return "较弱".tr;
|
||||||
|
}
|
||||||
|
if (signal > 1 && signal <= 2) {
|
||||||
|
return "弱".tr;
|
||||||
|
}
|
||||||
|
if (signal > 2 && signal <= 3) {
|
||||||
|
return "一般".tr;
|
||||||
|
}
|
||||||
|
if (signal > 3) {
|
||||||
|
return "强".tr;
|
||||||
|
}
|
||||||
|
return "未知数据".tr;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getBedStatus(int status) {
|
||||||
|
if (status == 0) {
|
||||||
|
return "离床".tr;
|
||||||
|
} else if (status == 1) {
|
||||||
|
return "在床".tr;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
int _getSignalLevel(int signal) {
|
||||||
|
if (signal <= 25) {
|
||||||
|
return 1;
|
||||||
|
} else if (signal <= 50) {
|
||||||
|
return 2;
|
||||||
|
} else if (signal <= 75) {
|
||||||
|
return 3;
|
||||||
|
} else {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -237,7 +237,9 @@ class _BluetoothPageState extends State<BluetoothPage> {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
_buildMenuButton(context, '设备校准', ""),
|
_buildMenuButton(context, '设备校准', ""),
|
||||||
_buildMenuButton(context, '体征传感器', ""),
|
_buildMenuButton(
|
||||||
|
context, '体征传感器', "/vitalSignsSensorPage",
|
||||||
|
arguments: obsData),
|
||||||
_buildMenuButton(context, 'WIFI配置', ""),
|
_buildMenuButton(context, 'WIFI配置', ""),
|
||||||
_buildMenuButton(
|
_buildMenuButton(
|
||||||
context, '睡眠习惯', "/sleepHabitPage"),
|
context, '睡眠习惯', "/sleepHabitPage"),
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ class LineView extends StatelessWidget {
|
|||||||
tips,
|
tips,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(0XFFFFFFFF), // 多了一个 F,建议改成正确格式
|
color: Color(0XFFFFFFFF), // 多了一个 F,建议改成正确格式
|
||||||
fontSize: 26.rpx,
|
fontSize: 20.rpx,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)));
|
)));
|
||||||
|
|||||||
@@ -131,25 +131,7 @@ class Smys extends GetView<SleepingHabitController> {
|
|||||||
letterSpacing: 0,
|
letterSpacing: 0,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(
|
|
||||||
|
|
||||||
// height:
|
|
||||||
// MediaQuery.sizeOf(context).height *
|
|
||||||
// 0.04,
|
|
||||||
child: FlutterSwitch(
|
|
||||||
width: 70.rpx,
|
|
||||||
height: 36.rpx,
|
|
||||||
toggleSize: 30.rpx,
|
|
||||||
activeColor: Color(0XFF6BFDAC),
|
|
||||||
inactiveColor: Color(0XFF003058),
|
|
||||||
toggleColor: Color(0xFF011D33),
|
|
||||||
value: controller.model.smysIsStart,
|
|
||||||
onToggle: (val) {
|
|
||||||
controller.attr.update((getmodel) {
|
|
||||||
getmodel.model.smysIsStart = val;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:ef/ef.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:vbvs_app/common/color/appConstants.dart';
|
import 'package:vbvs_app/common/color/appConstants.dart';
|
||||||
import 'package:vbvs_app/common/util/FitTool.dart';
|
import 'package:vbvs_app/common/util/FitTool.dart';
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Widget WeekDataWidget(
|
|||||||
return [
|
return [
|
||||||
AvgSleepScoreWidget(
|
AvgSleepScoreWidget(
|
||||||
sleepReport: sleepReport,
|
sleepReport: sleepReport,
|
||||||
), //睡眠评分
|
),
|
||||||
SleepChartContainer(
|
SleepChartContainer(
|
||||||
title: "每日得分",
|
title: "每日得分",
|
||||||
tipText: "用户本周睡眠分数的汇总。",
|
tipText: "用户本周睡眠分数的汇总。",
|
||||||
@@ -100,7 +100,6 @@ Widget WeekDataWidget(
|
|||||||
),
|
),
|
||||||
showLabel: sleepReport['scoreList']['type'],
|
showLabel: sleepReport['scoreList']['type'],
|
||||||
),
|
),
|
||||||
|
|
||||||
SleepCard(
|
SleepCard(
|
||||||
sleepReport: sleepReport,
|
sleepReport: sleepReport,
|
||||||
highlightItem: data['itemName'],
|
highlightItem: data['itemName'],
|
||||||
@@ -368,7 +367,7 @@ Widget WeekDataWidget(
|
|||||||
padding: 45.rpx),
|
padding: 45.rpx),
|
||||||
TrendDataTablePage(
|
TrendDataTablePage(
|
||||||
title: sleepReport['dysp'][2]['name'],
|
title: sleepReport['dysp'][2]['name'],
|
||||||
tipText:sleepReport['dysp'][2]['tips'],
|
tipText: sleepReport['dysp'][2]['tips'],
|
||||||
chartContent: LineView(
|
chartContent: LineView(
|
||||||
xLabels: [
|
xLabels: [
|
||||||
ChartLables(
|
ChartLables(
|
||||||
@@ -600,7 +599,6 @@ Widget WeekDataWidget(
|
|||||||
bottomPadding: 50,
|
bottomPadding: 50,
|
||||||
),
|
),
|
||||||
padding: 45.rpx),
|
padding: 45.rpx),
|
||||||
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,7 @@ import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.d
|
|||||||
import 'package:vbvs_app/pages/mh_page/HomeDeviceType.dart';
|
import 'package:vbvs_app/pages/mh_page/HomeDeviceType.dart';
|
||||||
import 'package:vbvs_app/pages/mh_page/LanguagePage.dart';
|
import 'package:vbvs_app/pages/mh_page/LanguagePage.dart';
|
||||||
import 'package:vbvs_app/pages/mh_page/ShareDeviceDetailWidget.dart';
|
import 'package:vbvs_app/pages/mh_page/ShareDeviceDetailWidget.dart';
|
||||||
|
import 'package:vbvs_app/pages/mh_page/Vital_signs_sensor.dart';
|
||||||
import 'package:vbvs_app/pages/mh_page/about_us.dart';
|
import 'package:vbvs_app/pages/mh_page/about_us.dart';
|
||||||
import 'package:vbvs_app/pages/mh_page/address_list_page.dart';
|
import 'package:vbvs_app/pages/mh_page/address_list_page.dart';
|
||||||
import 'package:vbvs_app/pages/mh_page/applyRepair/apply_repair_success.dart';
|
import 'package:vbvs_app/pages/mh_page/applyRepair/apply_repair_success.dart';
|
||||||
@@ -115,6 +116,9 @@ var mhroutes = {
|
|||||||
"/mhtSleepReportReturnPage": (context, {arguments}) =>
|
"/mhtSleepReportReturnPage": (context, {arguments}) =>
|
||||||
MhtSleepReportReturnPage(data: arguments),
|
MhtSleepReportReturnPage(data: arguments),
|
||||||
"/xiaoEPage": (contxt, {arguments}) => XiaoEPage(sleepUri: arguments),
|
"/xiaoEPage": (contxt, {arguments}) => XiaoEPage(sleepUri: arguments),
|
||||||
|
"/vitalSignsSensorPage": (context, {arguments}) => VitalSignsSensorPage(
|
||||||
|
data: arguments,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
var mhonGenerateRoute = (RouteSettings settings) {
|
var mhonGenerateRoute = (RouteSettings settings) {
|
||||||
final String? name = settings.name; // 获取路由名称,如 /news 或 /search
|
final String? name = settings.name; // 获取路由名称,如 /news 或 /search
|
||||||
|
|||||||
Reference in New Issue
Block a user