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; final VoidCallback? onRefresh; // 添加回调函数 VitalSignsWidget({ super.key, required this.sleepReport, this.onRefresh, // 可选参数 }); @override State createState() => _VitalSignsWidgetState(); } class _VitalSignsWidgetState extends State { @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 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: () async { MHTHomeController homeController = Get.find(); await 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, 'retrun_fresh': true, 'reportPadding':false, }); if (widget.onRefresh != null) { widget.onRefresh!(); } }, 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(); } } }