Files
tuiche/lib/pages/sleep_report/component/Vital_signs.dart
2025-08-12 17:22:11 +08:00

260 lines
9.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:EasyDartModule/EasyDartModule.dart' as es;
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.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/tool/ClickableContainer.dart';
import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
//睡眠规律性
class VitalSignsWidget extends StatefulWidget {
var sleepReport;
VitalSignsWidget({super.key, required this.sleepReport});
@override
State<VitalSignsWidget> createState() => _VitalSignsWidgetState();
}
class _VitalSignsWidgetState extends State<VitalSignsWidget> {
@override
void setState(VoidCallback callback) {
super.setState(callback);
}
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
try {
if (widget.sleepReport == null ||
widget.sleepReport is! Map ||
widget.sleepReport.isEmpty) {
return Container();
}
List showLabel = widget.sleepReport['sleepData']['type']
.where((item) => item['show'] != false)
.toList();
final bsList = widget.sleepReport['bs'] as List;
List snoreValues = [];
List lightSnore = widget.sleepReport['ssp']['data'][0];
List heavySnore = widget.sleepReport['ssp']['data'][1];
snoreValues = [...lightSnore, ...heavySnore];
snoreValues.sort((a, b) {
return a['st'].compareTo(b['st']);
});
Map time = MyUtils.diffHoursMinutesMap(
widget.sleepReport['startTime'], widget.sleepReport['endTime']);
int hour = time['hours'];
int minutes = time['minutes'];
final matched = bsList.firstWhere(
(item) => item['id'] == 105,
orElse: () => {},
);
List svgList = [
'assets/img/icon/home_heart.svg',
'assets/img/icon/home_hrv.svg',
'assets/img/icon/home_breath.svg'
];
List nameList = ['平均心率'.tr, '平均hrv'.tr, '平均呼吸'.tr];
// brs 307【平均呼吸】
// hrs 206【平均心率】 203【hrv】
final hrsList = widget.sleepReport['hrs'] ?? [];
final brsList = widget.sleepReport['brs'] ?? [];
// 获取对应 id 的原始 value
final avgHeartRate = hrsList.firstWhere(
(e) => e['id'] == 206,
orElse: () => {},
);
final hrv = hrsList.firstWhere(
(e) => e['id'] == 203,
orElse: () => {},
);
final avgBreath = brsList.firstWhere(
(e) => e['id'] == 307,
orElse: () => {},
);
// 构建 valueList原始数据未格式化
List<dynamic> valueList = [
avgHeartRate['value'],
hrv['value'],
avgBreath['value'],
];
List stages = widget.sleepReport['sleepData']['stages'];
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, 10.rpx, 26.rpx, 45.rpx),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
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,
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,
),
),
),
],
),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
OutlinedButton(
onPressed: () {
MHTHomeController homeController = Get.find();
Get.toNamed("/newSleepReportPage", arguments: {
'date': widget.sleepReport['endTime'],
"mac": homeController.selectDevcie.value,
'type': 1,
'backgroundImg': 'assets/images/new_background.png',
'person_show': false,
'itemName': 206,
});
},
style: OutlinedButton.styleFrom(
side: const BorderSide(color: Color(0XFF85F5FF)),
foregroundColor: Color(0XFF85F5FF),
minimumSize: Size(202.rpx, 62.rpx),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
),
child: Text('查看详情'.tr),
),
])
],
),
),
SizedBox(
height: 40.rpx,
),
Row(
children: List.generate(3, (index) {
return Expanded(
// 平均宽度
child: SizedBox(
// height: 120.rpx, // 固定高度,例如 120.rpx根据实际调整
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
padding: EdgeInsetsDirectional.fromSTEB(
0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部
width: 42.rpx,
height: 42.rpx,
child: SvgPicture.asset(
svgList[index],
fit: BoxFit.cover,
// color: themeController.currentColor.sc4,
),
),
SizedBox(width: 5.rpx),
Text(
valueList[index] == null ||
valueList[index].toString().isEmpty
? "-"
: "${valueList[index]}",
style: TextStyle(
color: themeController.currentColor.sc3,
fontSize: 60.rpx,
),
),
],
),
SizedBox(height: 42.rpx),
Text(
"${nameList[index]}",
style: TextStyle(
color: stringToColor("#929699"),
fontSize: AppConstants().normal_text_fontSize,
),
),
],
),
),
);
}),
),
// SizedBox(
// height: 130.rpx,
// ),
],
),
),
);
} catch (e) {
es.EasyDartModule.logger.error("打鼾监测绘制异常${e}");
return Container();
}
}
}