分享设备用户列表

This commit is contained in:
czz
2025-07-23 13:55:46 +08:00
parent e80011161c
commit 1356eb9e19
61 changed files with 648 additions and 568 deletions

View File

@@ -17,6 +17,7 @@ class ServiceConstant {
static String person_info = "/api/personnel/info"; //用户资料 static String person_info = "/api/personnel/info"; //用户资料
static String sleep_report = "/api/device/sleep/data"; //睡眠报告 static String sleep_report = "/api/device/sleep/data"; //睡眠报告
static String device_share = "/api/device/share"; //分享设备 static String device_share = "/api/device/share"; //分享设备
static String message_list = "/api/mesasge/list"; //消息列表 static String message_list = "/api/mesasge/list"; //消息列表
static String message_read = "/api/mesasge/read"; //消息未读数量 static String message_read = "/api/mesasge/read"; //消息未读数量
static String device_show = "/api/device/bind"; //更新设备绑定 static String device_show = "/api/device/bind"; //更新设备绑定

View File

@@ -379,24 +379,41 @@ var returnIconButtom = IconButton(
icon: Icon(Icons.navigate_before, size: 60.rpx), icon: Icon(Icons.navigate_before, size: 60.rpx),
); );
var returnIconButtomNew = ClickableContainer( // var returnIconButtomNew = ClickableContainer(
// backgroundColor: Colors.transparent,
// highlightColor: Colors.transparent,
// padding: EdgeInsets.fromLTRB(20.rpx, 20.rpx, 20.rpx, 20.rpx),
// onTap: () => Get.back(),
// child: Container(
// // height: 42.rpx,
// // width: 42.rpx,
// child: SvgPicture.asset(
// 'assets/img/icon/return_buttom.svg',
// width: 42.rpx,
// height: 42.rpx,
// ),
// // SvgPicture.asset(
// // 'assets/img/icon/expand.svg',
// // color: Colors.white,
// // )
// ));
Widget returnIconButtomNew({VoidCallback? onBack}) {
return ClickableContainer(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
padding: EdgeInsets.fromLTRB(20.rpx, 20.rpx, 20.rpx, 20.rpx), padding: EdgeInsets.fromLTRB(20.rpx, 20.rpx, 20.rpx, 20.rpx),
onTap: () => Get.back(), onTap: () {
child: Container( if (onBack != null) onBack(); // 执行回调
// height: 42.rpx, Get.back(); // 返回
// width: 42.rpx, },
child: SvgPicture.asset( child: SvgPicture.asset(
'assets/img/icon/return_buttom.svg', 'assets/img/icon/return_buttom.svg',
width: 42.rpx, width: 42.rpx,
height: 42.rpx, height: 42.rpx,
), ),
// SvgPicture.asset( );
// 'assets/img/icon/expand.svg', }
// color: Colors.white,
// )
));
// IconButton( // IconButton(
// padding: EdgeInsets.zero, // 去除默认 padding // padding: EdgeInsets.zero, // 去除默认 padding

View File

@@ -3,12 +3,14 @@ import 'dart:ui';
import 'package:EasyDartModule/EasyDartModule.dart'; import 'package:EasyDartModule/EasyDartModule.dart';
import 'package:ef/ef.dart'; import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/app_uri_status.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/DailyLogUtils.dart';
import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/mh_controller/device.dart'; import 'package:vbvs_app/controller/mh_controller/device.dart';
import 'package:vbvs_app/model/api_response.dart'; import 'package:vbvs_app/model/api_response.dart';
@@ -71,6 +73,7 @@ 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 { getVitalList(String mac) async {
try { try {
@@ -133,4 +136,27 @@ class DeviceListController extends GetControllerEx<DeviceListModel> {
); );
return msg; return msg;
} }
unbindShareDevice(String id, String mac, BuildContext context) async {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.device_bind;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String msg = '';
await requestWithLog(
logTitle: '解绑设备',
method: MyHttpMethod.delete,
queryUrl: queryUrl,
data: {"mac": mac, "uid": id},
onSuccess: (res) {
TopSlideNotification.show(context,
text: res.msg!, textColor: Color(0XFF00C1AA));
},
onFailure: (err) {
TopSlideNotification.show(context,
text: err.msg!, textColor: Color(0xFFFF7159));
},
);
}
} }

View File

@@ -33,7 +33,6 @@ class MHDeviceShareModel {
// {"type": 2} // {"type": 2}
// ]; // ];
List<dynamic>? shareUser = []; List<dynamic>? shareUser = [];
Map mainShare = {};
MHDeviceShareModel(); MHDeviceShareModel();
static MHDeviceShareModel fromJson(Map<String, dynamic> json) => static MHDeviceShareModel fromJson(Map<String, dynamic> json) =>

View File

@@ -17,8 +17,7 @@ MHDeviceShareModel _$MHDeviceShareModelFromJson(Map<String, dynamic> json) =>
..offset = (json['offset'] as num).toInt() ..offset = (json['offset'] as num).toInt()
..isLoading = json['isLoading'] as bool ..isLoading = json['isLoading'] as bool
..hasMore = json['hasMore'] as bool ..hasMore = json['hasMore'] as bool
..shareUser = json['shareUser'] as List<dynamic>? ..shareUser = json['shareUser'] as List<dynamic>?;
..mainShare = json['mainShare'] as Map<String, dynamic>;
Map<String, dynamic> _$MHDeviceShareModelToJson(MHDeviceShareModel instance) => Map<String, dynamic> _$MHDeviceShareModelToJson(MHDeviceShareModel instance) =>
<String, dynamic>{ <String, dynamic>{
@@ -32,5 +31,4 @@ Map<String, dynamic> _$MHDeviceShareModelToJson(MHDeviceShareModel instance) =>
'isLoading': instance.isLoading, 'isLoading': instance.isLoading,
'hasMore': instance.hasMore, 'hasMore': instance.hasMore,
'shareUser': instance.shareUser, 'shareUser': instance.shareUser,
'mainShare': instance.mainShare,
}; };

View File

@@ -99,7 +99,7 @@ Future<void> main() async {
await initLogin(); await initLogin();
await messageStatus(); await messageStatus();
startMessagePolling(); startMessagePolling(selectapp);
// 检查网络 // 检查网络
Checknetwork.checkNetwork(); Checknetwork.checkNetwork();
// 微信开放平台注册 // 微信开放平台注册
@@ -150,15 +150,34 @@ Future<void> initWX() async {
} }
Timer? _messageTimer; Timer? _messageTimer;
void startMessagePolling() { // void startMessagePolling() {
// 避免重复启动 // // 避免重复启动
// _messageTimer?.cancel();
// _messageTimer = Timer.periodic(Duration(seconds: 10), (timer) async {
// try {
// MessageController messageController = Get.find();
// messageController.getMessageStatus();
// // print("轮询消息状态成功");
// } catch (e) {
// print("轮询消息状态失败: $e");
// }
// });
// }
void startMessagePolling(String selectapp) {
_messageTimer?.cancel(); _messageTimer?.cancel();
_messageTimer = Timer.periodic(Duration(seconds: 10), (timer) async { _messageTimer = Timer.periodic(Duration(seconds: 10), (timer) async {
try { try {
MessageController messageController = Get.find(); if (selectapp == 'mht') {
messageController.getMessageStatus(); if (Get.isRegistered<MhMessageController>()) {
// print("轮询消息状态成功"); Get.find<MhMessageController>().getMessageStatus();
}
} else {
if (Get.isRegistered<MessageController>()) {
Get.find<MessageController>().getMessageStatus();
}
}
} catch (e) { } catch (e) {
print("轮询消息状态失败: $e"); print("轮询消息状态失败: $e");
} }

View File

@@ -90,6 +90,9 @@ class _CalibrationPageState extends State<CalibrationPage> {
fontSize: 30.rpx, fontSize: 30.rpx,
), ),
), ),
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomAddCallback(() { child: returnIconButtomAddCallback(() {

View File

@@ -318,7 +318,6 @@ class _DeviceSharePageState extends State<DeviceSharePage> {
text: apiResponse.msg!, text: apiResponse.msg!,
textColor: themeController.currentColor.sc9); textColor: themeController.currentColor.sc9);
} }
}, },
colors: [ colors: [
// 渐变色 // 渐变色

View File

@@ -138,7 +138,7 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
// height: 25.rpx, // 如果 SVG 中没有固定颜色,使用 color 设置 // height: 25.rpx, // 如果 SVG 中没有固定颜色,使用 color 设置
// color: themeController.currentColor.sc3, // color: themeController.currentColor.sc3,
// ), // ),
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
), ),
Expanded( Expanded(

View File

@@ -50,7 +50,7 @@ class _BackMovementPageState extends State<BackMovementPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -58,7 +58,7 @@ class _HomeDeviceTypeState extends State<HomeDeviceType> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -66,7 +66,7 @@ class LanguagePage extends GetView<MHLanguageController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -1,43 +1,60 @@
import 'dart:io';
import 'package:ef/base/widget/flutterflow/FlutterFlowTheme.dart'; import 'package:ef/base/widget/flutterflow/FlutterFlowTheme.dart';
import 'package:ef/ef.dart'; import 'package:ef/ef.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/appColors.dart'; import 'package:fluwx/fluwx.dart';
import 'package:vbvs_app/common/color/ServiceConstant.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';
import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/mh_controller/device_list_controller.dart';
import 'package:vbvs_app/controller/mh_controller/mhdevice_share_controller.dart'; import 'package:vbvs_app/controller/mh_controller/mhdevice_share_controller.dart';
import 'package:vbvs_app/pages/common/selectDialog.dart'; import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart';
import '../../common/color/appFontsize.dart'; import '../../common/color/appFontsize.dart';
class ShareDeviceDetailWidget extends GetView { class ShareDeviceDetailWidget extends GetView {
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
Map data;
ShareDeviceDetailWidget({super.key, required this.data});
getLine() {
return Divider(
color: const Color(0XFF929699),
thickness: 0.5.rpx,
);
}
var opType = 1.obs;
bool isProgrammaticPop = false; // 标记变量
DateTime? _lastBackPressedTime; // 记录上一次返回的时间
DeviceListController deviceListController = Get.find();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
MHDeviceShareController deviceShareController = Get.find(); opType.value = data['info'][3]['opType'];
var shareInfo = deviceShareController.model.mainShare;
RxInt type = 1.obs;
type.value = shareInfo['op_type'];
return GestureDetector( return GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),, // onTap: () => FocusScope.of(context).unfocus(),,
child: Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
),
),
child: Scaffold( child: Scaffold(
key: scaffoldKey, key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, backgroundColor: Colors.transparent,
appBar: AppBar( appBar: AppBar(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
iconTheme: IconThemeData(color: Colors.white), iconTheme: const IconThemeData(color: Colors.white),
titleSpacing: 0, titleSpacing: 0,
// leading: returnIconButtomAddCallback(() { title: SizedBox(
// controller.saveDataApi();
// updateParm(isShowToast: false);
// }),
// leading: returnIconButtomNew,
title: Container(
width: double.infinity, width: double.infinity,
height: 180.rpx, height: 180.rpx,
child: Stack( child: Stack(
@@ -55,84 +72,176 @@ class ShareDeviceDetailWidget extends GetView {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(onBack: () async {
try {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.device_show;
String queryUrl =
"$serviceAddress$serviceName$serviceApi";
await requestWithLog(
logTitle: "更新设备信息",
method: MyHttpMethod.put,
queryUrl: queryUrl,
data: {
"id": data['info'][4]["id"],
"opType": opType.value
},
onSuccess: (res) {
TopSlideNotification.show(context,
text: "更新成功".tr, textColor: Color(0XFF00C1AA));
deviceListController.getDeviceList();
try {
WebviewTestController webviewTestController =
Get.find();
webviewTestController.web.jsbridge?.dart
.alterDevice();
} catch (e) {
ef.log("[h5]通知列表更新错误:$e");
}
},
onFailure: (res) {
TopSlideNotification.show(context,
text: "更新失败".tr, textColor: Color(0xFFFF7159));
},
);
} catch (e) {
print(e);
}
}),
), ),
], ],
), ),
), ),
actions: [],
centerTitle: false, centerTitle: false,
), ),
body: Container( body: PopScope(
canPop: false,
onPopInvokedWithResult: (disposition, result) async {
if (isProgrammaticPop) {
// 如果是程序触发,重置标记并忽略
isProgrammaticPop = false;
return; // 阻止处理
}
try {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.device_show;
String queryUrl = "$serviceAddress$serviceName$serviceApi";
await requestWithLog(
logTitle: "更新设备信息",
method: MyHttpMethod.put,
queryUrl: queryUrl,
data: {"id": data['info'][4]["id"], "opType": opType.value},
onSuccess: (res) {
TopSlideNotification.show(context,
text: "更新成功".tr, textColor: Color(0XFF00C1AA));
deviceListController.getDeviceList();
try {
WebviewTestController webviewTestController = Get.find();
webviewTestController.web.jsbridge?.dart.alterDevice();
} catch (e) {
ef.log("[h5]通知列表更新错误:$e");
}
},
onFailure: (res) {
TopSlideNotification.show(context,
text: "更新失败".tr, textColor: Color(0xFFFF7159));
},
);
} catch (e) {
print(e);
}
if (Platform.isAndroid) {
var flag = await _handleBackPressed(context); // 自定义返回逻辑
if (flag) {
SystemNavigator.pop();
}
}
},
child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height * 1, height: MediaQuery.sizeOf(context).height * 1,
decoration: BoxDecoration(
color: Color(0xFFF6F6F6),
),
child: Padding( child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(15, 0, 15, 0), padding:
EdgeInsetsDirectional.fromSTEB(30.rpx, 34.rpx, 30.rpx, 0),
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Padding( Container(
padding: EdgeInsetsDirectional.fromSTEB(0, 13, 0, 0),
child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).secondaryBackground,
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
), ),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 13, 16, 15),
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Column( Padding(
padding: EdgeInsetsDirectional.only(
start: 27.rpx, bottom: 18.rpx),
child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'${shareInfo['userName']}', data['info'][0]['v'],
// '${shareInfo['userName']}',
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(context)
.bodyMedium .bodyMedium
.override( .override(
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
color: Color(0xFF333333), color: const Color(0xFFFFFFFF),
fontSize: 15, fontSize: 28.rpx,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold,
), ),
), ),
Text( Text(
'分享时间:${MyUtils.timestampToDateString(int.parse(shareInfo['startTime'].toString()))}', '分享时间:${data['info'][2]['v']}',
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(context)
.bodyMedium .bodyMedium
.override( .override(
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7), color: const Color(0xFF9EA4B7),
fontSize: 11, fontSize: 20.rpx,
letterSpacing: 0.0, letterSpacing: 0.0,
), ),
), ),
].divide(SizedBox(height: 5)), ].divide(SizedBox(height: 10.rpx)),
), ),
Obx( ),
() => GestureDetector( getLine(),
SizedBox(
height: 25.rpx,
),
Container(
decoration: BoxDecoration(
color: Color(0xFF003058),
borderRadius: BorderRadius.circular(16.rpx)),
child: Padding(
padding: EdgeInsetsDirectional.only(
start: 38.rpx,
top: 50.rpx,
end: 30.rpx,
bottom: 30.rpx),
child: Column(
children: [
GestureDetector(
onTap: () { onTap: () {
// 当点击时,将 type 设置为 0允许控制 // 当点击时,将 type 设置为 0允许控制
type.value = 1;
controller.updateAll(); data['info'][3]['opType'] = 1;
opType.value = 1;
}, },
child: Container( child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
constraints: BoxConstraints( constraints: const BoxConstraints(
minHeight: 46, minHeight: 46,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(0), borderRadius:
BorderRadius.circular(0),
), ),
child: Row( child: Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
@@ -141,47 +250,80 @@ class ShareDeviceDetailWidget extends GetView {
children: [ children: [
Text( Text(
'允许对方控制和查看该设备'.tr, '允许对方控制和查看该设备'.tr,
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(
context)
.bodyMedium .bodyMedium
.override( .override(
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
color: Color(0xFF333333), color:
fontSize: 13, const Color(0xFFFFFFFF),
fontSize: 27.rpx,
letterSpacing: 0.0, letterSpacing: 0.0,
), ),
), ),
Align( Obx(() {
alignment: AlignmentDirectional(0, -1), return Container(
child: Icon( height: 33.rpx,
type.value == 1 child: AspectRatio(
? Icons.check_circle // 选中时为实心圆 aspectRatio: 1,
: Icons child: Center(
.radio_button_unchecked, // 未选中时为空心圆 child: Container(
color: type.value == 1 height: 33.rpx,
? Color(0xFFD3B684) // 选中时的颜色 width: 33.rpx,
: Colors.grey, // 未选中时的颜色 decoration: BoxDecoration(
size: 18, borderRadius:
BorderRadius
.circular(
33.rpx / 2),
border: Border.all(
width:
opType.value == 1
? 1
: 0.5,
color:
Color(0xFFC8CBD2),
), ),
), ),
child: opType.value == 1
? Center(
child: ClipOval(
child:
Container(
width:
33.rpx *
0.6,
height:
33.rpx *
0.6,
color: const Color(
0xFF6BFDAC),
),
),
)
: null,
),
),
),
);
})
], ],
), ),
), ),
), ),
), GestureDetector(
Obx(
() => GestureDetector(
onTap: () { onTap: () {
// 当点击时,将 type 设置为 1仅允许查看 // 当点击时,将 type 设置为 1仅允许查看
type.value = 2; data['info'][3]['opType'] = 2;
controller.updateAll(); opType.value = 2;
}, },
child: Container( child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
constraints: BoxConstraints( constraints: const BoxConstraints(
minHeight: 46, minHeight: 46,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(0), borderRadius:
BorderRadius.circular(0),
), ),
child: Row( child: Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
@@ -190,62 +332,99 @@ class ShareDeviceDetailWidget extends GetView {
children: [ children: [
Text( Text(
'仅允许对方查看该设备'.tr, '仅允许对方查看该设备'.tr,
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(
context)
.bodyMedium .bodyMedium
.override( .override(
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
color: Color(0xFF333333), color:
fontSize: 13, const Color(0xFFFFFFFF),
fontSize: 27.rpx,
letterSpacing: 0.0, letterSpacing: 0.0,
), ),
), ),
Align( Obx(() {
alignment: AlignmentDirectional(0, -1), return Container(
child: Icon( height: 33.rpx,
type.value == 2 child: AspectRatio(
? Icons.check_circle // 选中时为实心圆 aspectRatio: 1,
: Icons child: Center(
.radio_button_unchecked, // 未选中时为空心圆 child: Container(
color: type.value == 2 height: 33.rpx,
? Color(0xFFD3B684) // 选中时的颜色 width: 33.rpx,
: Colors.grey, // 未选中时的颜色 decoration: BoxDecoration(
size: 18, borderRadius:
BorderRadius
.circular(
33.rpx / 2),
border: Border.all(
width:
opType.value == 2
? 1
: 0.5,
color:
Color(0xFFC8CBD2),
), ),
), ),
child: opType.value == 2
? Center(
child: ClipOval(
child:
Container(
width:
33.rpx *
0.6,
height:
33.rpx *
0.6,
color: const Color(
0xFF6BFDAC),
),
),
)
: null,
),
),
),
);
})
], ],
), ),
), ),
), ),
],
), ),
].divide(SizedBox(height: 13)), ))
), ]),
),
),
), ),
Padding( Padding(
padding: EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
15, 0, 15, AppConstants.page_button_bottom_padding), 0, 0, 0, AppConstants.page_button_bottom_padding),
child: Container( child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height * 0.056, height: MediaQuery.sizeOf(context).height * 0.056,
constraints: BoxConstraints( constraints: const BoxConstraints(
minHeight: 46, minHeight: 46,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).secondaryBackground, color: FlutterFlowTheme.of(context).secondaryBackground,
borderRadius: BorderRadius.circular(16.rpx),
), ),
child: Container( child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height * 0.056, height: MediaQuery.sizeOf(context).height * 0.056,
decoration: BoxDecoration( decoration: BoxDecoration(
color: color: FlutterFlowTheme.of(context)
FlutterFlowTheme.of(context).secondaryBackground, .secondaryBackground,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(16.rpx),
), ),
child: CustomCard( child: CustomCard(
borderRadius: 16.rpx, borderRadius: 16.rpx,
gradientDirection: GradientDirection.vertical, gradientDirection: GradientDirection.vertical,
onTap: () async {}, onTap: () async {
deviceListController.unbindShareDevice(
data['info'][5]['uid'], data['mac'], context);
},
colors: const [ colors: const [
Color(0xFFFCFCFC), Color(0xFFFCFCFC),
Color(0xFFF8FAF9), Color(0xFFF8FAF9),
@@ -258,7 +437,7 @@ class ShareDeviceDetailWidget extends GetView {
height: 90.rpx, height: 90.rpx,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6), borderRadius: BorderRadius.circular(16.rpx),
), ),
child: Text("解除分享".tr, child: Text("解除分享".tr,
style: TextStyle( style: TextStyle(
@@ -266,47 +445,7 @@ class ShareDeviceDetailWidget extends GetView {
fontSize: 30.rpx, fontSize: 30.rpx,
)), )),
), ),
) )),
// FFButtonWidget(
// onPressed: () {
// showCustomConfirmDialog(context, "是否确定删除?").then((v) {
// if ('confirm' == v) {
// // deviceShareController
// // .deleteShare(shareInfo)
// // .then((d) {
// // deviceShareController.initData();
// // deviceShareController.updateAll();
// // Get.back();
// // });
// // print("showCustomConfirmDialog $v");
// }
// });
// },
// text: '删除',
// options: FFButtonOptions(
// height: 40,
// padding: EdgeInsetsDirectional.fromSTEB(24, 0, 24, 0),
// iconPadding:
// EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
// color: Color(0xFFE55E92),
// textStyle:
// FlutterFlowTheme.of(context).titleSmall.override(
// fontFamily: 'Readex Pro',
// color: Colors.white,
// fontSize: 13,
// letterSpacing: 0.0,
// ),
// elevation: 3,
// borderSide: BorderSide(
// color: Colors.transparent,
// width: 1,
// ),
// borderRadius: BorderRadius.circular(8),
// ),
// ),
),
), ),
), ),
], ],
@@ -314,6 +453,23 @@ class ShareDeviceDetailWidget extends GetView {
), ),
), ),
), ),
),
));
}
Future<bool> _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; // 允许退出程序
}
} }
} }

View File

@@ -10,17 +10,20 @@ import 'package:vbvs_app/controller/mh_controller/mhdevice_share_controller.dart
class ShareUserWidget extends GetView { class ShareUserWidget extends GetView {
int index; int index;
MHDeviceShareController repairListController; MHDeviceShareController repairListController;
String mac;
ShareUserWidget({required this.index, required this.repairListController}) {} ShareUserWidget(
{required this.index,
required this.repairListController,
required this.mac}) {}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var info = repairListController.model.shareUser![index]; var info = repairListController.model.shareUser![index];
// info = info.add({'mac': mac});
return InkWell( return InkWell(
onTap: () { onTap: () {
repairListController.model.mainShare = Get.toNamed('/shareDeviceDetail',
repairListController.model.shareUser![index]; arguments: {"mac": mac, "info": info});
Get.toNamed('/shareDeviceDetail');
}, },
child: Container( child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
@@ -62,7 +65,7 @@ class ShareUserWidget extends GetView {
child: Align( child: Align(
alignment: const AlignmentDirectional(-1, 0), alignment: const AlignmentDirectional(-1, 0),
child: Text( child: Text(
'${info['userName']}', '${info[0]['v']}',
style: TextStyle( style: TextStyle(
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
color: Colors.white, color: Colors.white,
@@ -77,9 +80,9 @@ class ShareUserWidget extends GetView {
child: Align( child: Align(
alignment: const AlignmentDirectional(-1, 0), alignment: const AlignmentDirectional(-1, 0),
child: Text( child: Text(
info['op_type'] == 1 info[3]['opType'] == 1
? '允许对方控制和查看该设备'.tr ? '允许对方控制和查看该设备'.tr
: info['op_type'] == 2 : info[3]['opType'] == 2
? '仅允许对方查看该设备'.tr ? '仅允许对方查看该设备'.tr
: '', : '',
style: TextStyle( style: TextStyle(

View File

@@ -80,7 +80,7 @@ class _VitalSignsSensorState extends State<VitalSignsSensorPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -79,7 +79,7 @@ class _MhAboutUsPageState extends State<MhAboutUsPage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -88,36 +88,6 @@ class _MhAboutUsPageState extends State<MhAboutUsPage> {
actions: [], actions: [],
centerTitle: false, centerTitle: false,
), ),
// body: SafeArea(
// top: true,
// child: Padding(
// padding: EdgeInsets.symmetric(horizontal: 30.rpx),
// child: Column(
// children: [
// Expanded(
// child: Obx(() {
// if (pdfController.localPdfPath.value == null) {
// return Center(child: CircularProgressIndicator());
// } else {
// return PDFView(
// filePath: pdfController.localPdfPath.value!,
// autoSpacing: false,
// enableSwipe: true,
// swipeHorizontal: false,
// pageSnap: true,
// fitEachPage: true,
// defaultPage: 0,
// onRender: (pages) => print('PDF 渲染完成,共 $pages 页'),
// onError: (error) => print('PDF 加载错误: $error'),
// );
// }
// }),
// ),
// ],
// ),
// ),
// ),
body: SafeArea( body: SafeArea(
top: true, top: true,
child: Padding( child: Padding(

View File

@@ -57,7 +57,7 @@ class AddressListPage extends GetView<AddressListController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -80,7 +80,7 @@ class ApplyRepairPage extends GetView<ApplyRepairController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -701,8 +701,6 @@ class ApplyRepairPage extends GetView<ApplyRepairController> {
), ),
), ),
), ),
Flexible( Flexible(
child: Container( child: Container(
width: MediaQuery.sizeOf( width: MediaQuery.sizeOf(
@@ -1401,7 +1399,6 @@ class ApplyRepairPage extends GetView<ApplyRepairController> {
color: Colors.white, color: Colors.white,
fontSize: 30.rpx, fontSize: 30.rpx,
letterSpacing: 0, letterSpacing: 0,
fontWeight: FontWeight.w600,
), ),
), ),
), ),

View File

@@ -28,37 +28,8 @@ class _BluetoothPageState extends State<BluetoothPage> {
void initState() { void initState() {
super.initState(); super.initState();
obsData = Map<String, dynamic>.from(widget.data).obs; // 复制成 obs obsData = Map<String, dynamic>.from(widget.data).obs; // 复制成 obs
// String text;
// if (obsData.containsKey('name') &&
// obsData['name'] != null &&
// obsData['name'].toString().isNotEmpty) {
// text = obsData['name'].toString();
// } else {
// text = '未命名'.tr;
// }
// _calculateTextHalfWidth(text);
} }
// void _calculateTextHalfWidth(String text) {
// final textSpan = TextSpan(
// text: text,
// style: TextStyle(
// fontSize: 40.rpx,
// height: 1,
// ),
// );
// final textPainter = TextPainter(
// text: textSpan,
// textDirection: ui.TextDirection.ltr,
// );
// textPainter.layout(); // 计算文本宽度
// setState(() {
// _textHalfWidth = textPainter.width / 2;
// });
// }
BoxConstraints? bodysize; BoxConstraints? bodysize;
DeviceListController deviceListController = Get.find(); DeviceListController deviceListController = Get.find();
@override @override
@@ -100,7 +71,7 @@ class _BluetoothPageState extends State<BluetoothPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -236,11 +207,21 @@ class _BluetoothPageState extends State<BluetoothPage> {
}); });
} }
}), }),
_buildMenuButton(context, '设备校准', "/mhtCalibrationAfterPage", arguments: obsData,), _buildMenuButton(
context,
'设备校准',
"/mhtCalibrationAfterPage",
arguments: obsData,
),
_buildMenuButton( _buildMenuButton(
context, '体征传感器', "/vitalSignsSensorPage", context, '体征传感器', "/vitalSignsSensorPage",
arguments: obsData), arguments: obsData),
_buildMenuButton(context, 'WIFI配置', "/mhtWifiAfterPage",arguments: obsData,), _buildMenuButton(
context,
'WIFI配置',
"/mhtWifiAfterPage",
arguments: obsData,
),
// _buildMenuButton( // _buildMenuButton(
// context, '睡眠习惯', "/sleepHabitPage"), // context, '睡眠习惯', "/sleepHabitPage"),
_buildMenuButton( _buildMenuButton(
@@ -252,7 +233,25 @@ class _BluetoothPageState extends State<BluetoothPage> {
context, context,
obsData['bind_type'] == 1 ? '解绑' : '删除', obsData['bind_type'] == 1 ? '解绑' : '删除',
"", "",
onTap: () {/*...*/}, onTap: () async {
await deviceListController
.unbindDevice(obsData);
await deviceListController
.getDeviceList();
MHTHomeController homeController =
Get.find();
homeController.selectDevcie.value = "";
try {
WebviewTestController
webviewTestController = Get.find();
webviewTestController.web.jsbridge?.dart
.unBindDevice();
} catch (e) {
ef.log("[h5]通知列表更新报错:$e");
}
Get.toNamed("/mianPageBottomChange");
},
), ),
_buildMenuButton( _buildMenuButton(
context, '详情', "/devicePeopleInfo", context, '详情', "/devicePeopleInfo",
@@ -330,64 +329,6 @@ class _BluetoothPageState extends State<BluetoothPage> {
}); });
} }
// Widget _buildMenuButton(
// BuildContext context,
// String title,
// String? path, {
// Map<dynamic, dynamic>? arguments,
// VoidCallback? onTap,
// }) {
// return Padding(
// padding: EdgeInsets.only(bottom: 19.rpx),
// child: ClickableContainer(
// backgroundColor: Colors.transparent,
// highlightColor: Color(0XFF055466),
// padding: EdgeInsets.only(left: 0),
// onTap: () {
// // if (path?.isNotEmpty == true) {
// // if (arguments != null) {
// // Get.toNamed(path!, arguments: arguments);
// // } else {
// // Get.toNamed(path!);
// // }
// // } else {
// // TopSlideNotification.show(
// // context,
// // text: "功能开发中...",
// // );
// // }
// if (onTap != null) {
// onTap(); // 优先执行自定义逻辑
// } else if (path?.isNotEmpty == true) {
// if (arguments != null) {
// Get.toNamed(path!, arguments: arguments);
// } else {
// Get.toNamed(path!);
// }
// } else {
// TopSlideNotification.show(
// context,
// text: "功能开发中...",
// );
// }
// },
// child: Container(
// height: MediaQuery.sizeOf(context).height * 0.0566,
// decoration: BoxDecoration(
// color: const Color(0xFF003058),
// borderRadius: BorderRadius.circular(16.rpx),
// ),
// child: Center(
// child: Text(
// title,
// style: const TextStyle(color: Colors.white, fontSize: 16),
// ),
// ),
// ),
// ),
// );
// }
Widget _buildMenuButton( Widget _buildMenuButton(
BuildContext context, BuildContext context,
String title, String title,
@@ -401,6 +342,7 @@ class _BluetoothPageState extends State<BluetoothPage> {
child: ClickableContainer( child: ClickableContainer(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
highlightColor: const Color(0XFF055466), highlightColor: const Color(0XFF055466),
borderRadius: 16.rpx,
padding: EdgeInsets.only(left: 0), padding: EdgeInsets.only(left: 0),
onTap: () async { onTap: () async {
if (onTap != null) { if (onTap != null) {

View File

@@ -64,7 +64,7 @@ class BookInfoPage extends GetView<BookInfoController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -63,7 +63,7 @@ class BookSuccessPage extends GetView {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -50,7 +50,7 @@ class DeletedAccountPage extends GetView {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -372,7 +372,8 @@ class DeviceInfoWidget extends GetView {
'的分享', '的分享',
style: TextStyle( style: TextStyle(
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
fontSize: 21.rpx, fontSize:
AppFontsize.normal_text_size,
letterSpacing: 0, letterSpacing: 0,
color: Colors.white, color: Colors.white,
), ),

View File

@@ -87,7 +87,7 @@ class _MHTBindDeviceTypePageState extends State<MHTBindDeviceTypePage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -180,7 +180,7 @@ class _MHTPeopleInfoPageState extends State<MHTPeopleInfoPage> {
), ),
Positioned( Positioned(
left: 20.rpx, left: 20.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
Positioned( Positioned(
right: 30.rpx, right: 30.rpx,

View File

@@ -71,7 +71,7 @@ class _DeviceListPageState extends State<DeviceListPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -78,7 +78,7 @@ class DevicePeopleInfo extends GetView<PeopleInfoController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -188,10 +188,8 @@ class DevicePeopleInfo extends GetView<PeopleInfoController> {
"体重:${person["weight"] == null ? "-" : "${person["weight"]}kg"}"), "体重:${person["weight"] == null ? "-" : "${person["weight"]}kg"}"),
getInfoRow(context, getInfoRow(context,
"生日:${person["birthday"] == null ? "-" : time_08_Formatter_pattern(person["birthday"], "yyyy年MM月dd日")}"), "生日:${person["birthday"] == null ? "-" : time_08_Formatter_pattern(person["birthday"], "yyyy年MM月dd日")}"),
getInfoRow(
context, "电话:${person["tel"] ?? "-"}"),
getInfoRow(context, getInfoRow(context,
"紧急联系人${person["contact"] ?? "-"}"), "联系方式${person["contact"] ?? "-"}"),
], ],
), ),
); );

View File

@@ -14,7 +14,7 @@ import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/pages/mh_page/ShareUserWidget.dart'; import 'package:vbvs_app/pages/mh_page/ShareUserWidget.dart';
class ShareDeviceWidget extends GetView<MHDeviceShareController> { class ShareDeviceWidget extends GetView<MHDeviceShareController> {
var data; Map data;
ShareDeviceWidget({super.key, required this.data}); ShareDeviceWidget({super.key, required this.data});
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
@@ -66,7 +66,7 @@ class ShareDeviceWidget extends GetView<MHDeviceShareController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -464,6 +464,7 @@ class ShareDeviceWidget extends GetView<MHDeviceShareController> {
.entries .entries
.map((e) => ShareUserWidget( .map((e) => ShareUserWidget(
index: e.key, index: e.key,
mac: data['mac'],
repairListController: repairListController:
controller)) controller))
.toList() as List<Widget>) .toList() as List<Widget>)

View File

@@ -81,7 +81,7 @@ class EditAddressPage extends GetView<AddressController>
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -83,7 +83,7 @@ class _EditBedPageState extends State<EditBedPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
if (widget.data != null && if (widget.data != null &&
(widget.data['isNextStep'] != null && (widget.data['isNextStep'] != null &&
@@ -120,8 +120,7 @@ class _EditBedPageState extends State<EditBedPage> {
bluetoothController.currentFullDevice; bluetoothController.currentFullDevice;
data['_id'] = device!.deviceID; data['_id'] = device!.deviceID;
data['isNextStep'] = true; data['isNextStep'] = true;
Get.toNamed("/roomPickerPage", Get.toNamed("/roomPickerPage", arguments: data);
arguments: data);
}, },
); );
}, },
@@ -148,7 +147,6 @@ class _EditBedPageState extends State<EditBedPage> {
), ),
), ),
) )
], ],
), ),
), ),

View File

@@ -96,7 +96,7 @@ class _ExperienceStorePageState extends State<ExperienceStorePage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
Positioned( Positioned(
right: 30.rpx, right: 30.rpx,

View File

@@ -51,7 +51,7 @@ class _HelpArticleState extends State<HelpArticle> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -254,7 +254,7 @@ class _MhtSleepReportReturnPageState extends State<MhtSleepReportReturnPage> {
left: 0, left: 0,
child: Row( child: Row(
children: [ children: [
returnIconButtomNew, returnIconButtomNew(),
Text( Text(
'健康报告'.tr, '健康报告'.tr,
style: TextStyle( style: TextStyle(

View File

@@ -847,7 +847,7 @@ class _NewHomePageState extends State<NewHomePage> {
fontFamily: 'Readex Pro', fontFamily: 'Readex Pro',
color: stringToColor("#85F5FF"), color: stringToColor("#85F5FF"),
letterSpacing: 0, letterSpacing: 0,
fontSize: 30.rpx, fontSize: 26.rpx,
), ),
), ),
], ],

View File

@@ -65,7 +65,7 @@ class IssueListPage extends GetView<IssueListController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -63,7 +63,7 @@ class _MessageDetailPageState extends State<MessageDetailPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -150,7 +150,7 @@ class _MessageDetailPageState extends State<MessageDetailPage> {
.toList(), .toList(),
), ),
), ),
].divide(SizedBox(width: 30.rpx)), ].divide(SizedBox(width: 20.rpx)),
), ),
], ],
))), ))),

View File

@@ -77,66 +77,6 @@ class _MessagePageState extends State<MessagePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// messageController.messageList.value = [
// {
// "_id": "6836c3ee4e626030c8000000",
// "type": "app_vsm",
// "data": {
// "title": "实时监测通知",
// "val": [
// {"k": "设备ID", "v": "48ca43b1b454"},
// {"k": "使用人员", "v": "bb"},
// {"k": "消息类型", "v": "呼吸异常"},
// {"k": "检测值", "v": '26'},
// {"k": "检测时间", "v": "2025-05-28 16:06:07"}
// ]
// },
// "level": 3,
// "tid": "67f5d96e26ef310463000000",
// "uid": "68319fe9702cc59bd1000000",
// "status": 0,
// "createTime": "1748419566651"
// },
// {
// "_id": "6836c3e84e625f30c8000000",
// "type": "app_vsm",
// "data": {
// "title": "实时监测通知",
// "val": [
// {"k": "设备ID", "v": "48ca43b1b454"},
// {"k": "使用人员", "v": "bb"},
// {"k": "消息类型", "v": "心率异常"},
// {"k": "检测值", "v": '115'},
// {"k": "检测时间", "v": "2025-05-28 16:06:00"}
// ]
// },
// "level": 3,
// "tid": "67f5d96e26ef310463000000",
// "uid": "68319fe9702cc59bd1000000",
// "status": 0,
// "createTime": "1748419560486"
// },
// {
// "_id": "6836bd0c4e625e30c8000000",
// "type": "app_vsm",
// "data": {
// "title": "实时监测通知",
// "val": [
// {"k": "设备ID", "v": "48ca43b1b454"},
// {"k": "使用人员", "v": "bb"},
// {"k": "消息类型", "v": "心率异常"},
// {"k": "检测值", "v": '107'},
// {"k": "检测时间", "v": "1748417761000"}
// ]
// },
// "level": 3,
// "tid": "67f5d96e26ef310463000000",
// "uid": "68319fe9702cc59bd1000000",
// "status": 0,
// "createTime": "1748417804381"
// }
// ];
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent, statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.light, statusBarIconBrightness: Brightness.light,
@@ -176,7 +116,7 @@ class _MessagePageState extends State<MessagePage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -89,7 +89,7 @@ class _MyExperiencePageState extends State<MyExperiencePage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -11,6 +11,7 @@ import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/mh_controller/message_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart';
import 'dart:ui' as ui; import 'dart:ui' as ui;
@@ -28,6 +29,7 @@ class _MinePageState extends State<NewMinePage> {
GlobalController globalController = Get.find(); GlobalController globalController = Get.find();
UserInfoController userInfoController = Get.find(); UserInfoController userInfoController = Get.find();
ThemeController themeController = Get.find(); ThemeController themeController = Get.find();
MhMessageController messageController = Get.find();
// final GlobalKey _textKey = GlobalKey(); // final GlobalKey _textKey = GlobalKey();
// double _textHalfWidth = 0; // double _textHalfWidth = 0;
@@ -93,35 +95,45 @@ class _MinePageState extends State<NewMinePage> {
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
titleSpacing: 0, titleSpacing: 0,
actions: [ actions: [
ClickableContainer( Obx(() {
return ClickableContainer(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
padding: EdgeInsets.only(right: 38.rpx), padding: EdgeInsets.only(right: 38.rpx),
onTap: () { onTap: () {
// if (userInfoController.model.login ==
// LoginStatus.LOGIN.code) {
// TopSlideNotification.show(
// context,
// text: "待开发功能".tr,
// );
// } else {
// TopSlideNotification.show(
// context,
// text: "必须登录提示".tr,
// textColor: themeController.currentColor.sc9,
// );
// Get.toNamed("/loginPage");
// }
Get.toNamed('/messagePage'); Get.toNamed('/messagePage');
}, },
child: Container( child: Stack(
clipBehavior: Clip.none,
children: [
Container(
height: 42.rpx, height: 42.rpx,
width: 42.rpx, width: 42.rpx,
child: SvgPicture.asset( child: SvgPicture.asset(
'assets/img/icon/message.svg', 'assets/img/icon/message.svg',
color: Colors.white, color: Colors.white,
// color: Colors.white, ),
))), ),
if (messageController.model.body_message_read == 1 ||
messageController.model.system_message_read == 1)
Positioned(
top: -4.rpx,
right: -4.rpx,
child: Container(
width: 14.rpx,
height: 14.rpx,
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
border: Border.all(
color: Colors.white, width: 2.rpx),
),
),
),
],
),
);
})
], ],
), ),
body: SafeArea( body: SafeArea(

View File

@@ -64,7 +64,7 @@ class _SettingPageState extends State<SettingPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -75,7 +75,7 @@ class PeopleInfoPage extends GetView<PeopleInfoController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
Positioned( Positioned(
right: 30.rpx, right: 30.rpx,

View File

@@ -75,7 +75,7 @@ class _PrivacyPolicyPageState extends State<PrivacyPolicyPage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -62,7 +62,7 @@ class RepairHistoryListPage extends GetView<RepairInfoController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -76,7 +76,7 @@ class DeviceRepairPage extends GetView<RepairListController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -103,7 +103,7 @@ class _RoomPickerPageState extends State<RoomPickerPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
if (widget.data != null && if (widget.data != null &&
(widget.data['isNextStep'] != null && (widget.data['isNextStep'] != null &&

View File

@@ -53,7 +53,7 @@ class ScorePage extends GetView<mh.ScoreController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -50,7 +50,7 @@ class _SleepHabitPageState extends State<SleepHabitPage> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -76,7 +76,7 @@ class Smys extends GetView<SleepingHabitController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -131,7 +131,6 @@ class Smys extends GetView<SleepingHabitController> {
letterSpacing: 0, letterSpacing: 0,
), ),
), ),
], ],
), ),
)), )),

View File

@@ -83,7 +83,7 @@ class _UpdateUserPageState extends State<EditUserPage> {
), ),
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
Positioned( Positioned(
right: 20.rpx, right: 20.rpx,

View File

@@ -71,7 +71,7 @@ class FindPasswordPage extends GetView<FindPasswordController> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -166,7 +166,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
// ), // ),
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),
@@ -182,6 +182,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
isProgrammaticPop = false; isProgrammaticPop = false;
return; // 阻止处理 return; // 阻止处理
} }
if (Platform.isAndroid) { if (Platform.isAndroid) {
var flag = await _handleBackPressed(context); // 自定义返回逻辑 var flag = await _handleBackPressed(context); // 自定义返回逻辑
if (flag) { if (flag) {
@@ -1786,8 +1787,8 @@ class MHTLoginPage extends GetView<MHTLoginController> {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
onTap: () async { onTap: () async {
// loginController.model.isIos == true && // loginController.model.isIos == true &&
MHTRegisterController MHTRegisterController registerController =
registerController = Get.find(); Get.find();
if (registerController if (registerController
.model.register_agree == .model.register_agree ==
null || null ||
@@ -1804,8 +1805,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
} }
MHTLoginController loginController = MHTLoginController loginController =
Get.find(); Get.find();
await loginController await loginController.wxLoginSendAuth();
.wxLoginSendAuth();
// TopSlideNotification.show(context, // TopSlideNotification.show(context,
// text: "测试阶段,暂不支持".tr); // text: "测试阶段,暂不支持".tr);
}, },

View File

@@ -57,7 +57,7 @@ class RegisterPage extends GetView<MHTRegisterController> {
), ),
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -214,7 +214,7 @@ class _RxhxMhtState extends State<RxhxMht> {
// 左侧图标 // 左侧图标
Positioned( Positioned(
left: 0.rpx, left: 0.rpx,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -71,7 +71,7 @@ class UpdatePasswordPage extends GetView<UpdatePasswordController> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtom, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -79,7 +79,7 @@ class _UserAgreementPageState extends State<UserAgreementPage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -180,7 +180,7 @@ class _MHTNewSleepReportPageState extends State<MHTNewSleepReportPage> {
widget.data['arrow'] == true) widget.data['arrow'] == true)
Positioned( Positioned(
left: 20, left: 20,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -123,7 +123,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -199,7 +199,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
// widget.data['arrow'] == true) // widget.data['arrow'] == true)
// Positioned( // Positioned(
// left: 0, // left: 0,
// child: returnIconButtomNew, // child: returnIconButtomNew(),
// ), // ),
// ], // ],
// ), // ),
@@ -238,7 +238,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
widget.data['arrow'] == true) widget.data['arrow'] == true)
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -77,7 +77,7 @@ class _SleepReportPageState extends State<SleepReportPage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -77,7 +77,7 @@ class _XiaoEPageState extends State<XiaoEPage> {
/// 左边返回按钮 /// 左边返回按钮
Positioned( Positioned(
left: 0, left: 0,
child: returnIconButtomNew, child: returnIconButtomNew(),
), ),
], ],
), ),

View File

@@ -114,7 +114,8 @@ var mhroutes = {
"/aboutUs": (contxt) => MhAboutUsPage(), "/aboutUs": (contxt) => MhAboutUsPage(),
"/userAgreementPage": (context) => UserAgreementPage(), "/userAgreementPage": (context) => UserAgreementPage(),
"/privacyPolicyPage": (context) => PrivacyPolicyPage(), "/privacyPolicyPage": (context) => PrivacyPolicyPage(),
"/shareDeviceDetail": (context) => ShareDeviceDetailWidget(), "/shareDeviceDetail": (context, {arguments}) =>
ShareDeviceDetailWidget(data: arguments),
"/messageDetail": (context, {arguments}) => "/messageDetail": (context, {arguments}) =>
MessageDetailPage(data: arguments), MessageDetailPage(data: arguments),
"/mhtSleepReportReturnPage": (context, {arguments}) => "/mhtSleepReportReturnPage": (context, {arguments}) =>