From bc14dae324839c274609efc3cfa87dbdefed7a37 Mon Sep 17 00:00:00 2001 From: czz <862977248@qq.com> Date: Sat, 2 Aug 2025 17:41:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/mhlangs/en_US.json | 3 +- assets/mhlangs/zh_CN.json | 2 +- assets/mhlangs/zh_TW.json | 2 +- lib/main.dart | 55 +- .../device_bind/componnet/bind_dialog.dart | 21 +- lib/pages/mh_page/MhMessageList.dart | 4 +- lib/pages/mh_page/Vital_signs_sensor.dart | 6 +- lib/pages/mh_page/apply_repair_page.dart | 4 +- lib/pages/mh_page/device_share_page.dart | 934 ++++++++++-------- pubspec.lock | 4 +- 10 files changed, 570 insertions(+), 465 deletions(-) diff --git a/assets/mhlangs/en_US.json b/assets/mhlangs/en_US.json index 8c21b31..7456d78 100644 --- a/assets/mhlangs/en_US.json +++ b/assets/mhlangs/en_US.json @@ -595,5 +595,6 @@ "该设备的历史数据将被清除": "The device's historical data will be deleted", "有一条新的设备分享消息": "You have a new device sharing message", "去查看": "View now", - "正常值":"range:" + "正常值": "range:", + "设备分享提醒": "Device Sharing Alert" } \ No newline at end of file diff --git a/assets/mhlangs/zh_CN.json b/assets/mhlangs/zh_CN.json index f79e69a..087644d 100644 --- a/assets/mhlangs/zh_CN.json +++ b/assets/mhlangs/zh_CN.json @@ -591,5 +591,5 @@ "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。", "删除后": "删除后", "该设备的历史数据将被清除": "该设备的历史数据将被清除","有一条新的设备分享消息":"有一条新的设备分享消息","去查看":"去查看", - "正常值":"正常值:" + "正常值":"正常值:","设备分享提醒":"设备分享提醒" } \ No newline at end of file diff --git a/assets/mhlangs/zh_TW.json b/assets/mhlangs/zh_TW.json index 0124c31..97953d7 100644 --- a/assets/mhlangs/zh_TW.json +++ b/assets/mhlangs/zh_TW.json @@ -593,5 +593,5 @@ "该设备的历史数据将被清除": "該設備的歷史數據將被清除", "有一条新的设备分享消息": "有一條新的設備分享消息", "去查看": "去查看", - "正常值": "正常值:" + "正常值": "正常值:","设备分享提醒":"設備分享提醒" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index f64fc14..69a9ee4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -185,8 +185,10 @@ Timer? _messageTimer; // }); // } void startMessagePolling(int ent_type) { - // Get.put(MhMessageController()); - // MhMessageController messageController = Get.find(); + Get.put(MhMessageController()); + MhMessageController messageController = Get.find(); + final Set _poppedMessageIds = {}; // 本地已弹窗的消息 ID(无论是否已读成功) + final Set _readMessageIds = {}; _messageTimer?.cancel(); if (ent_type == APPPackageType.MHT.code) { if (Get.isRegistered()) { @@ -197,11 +199,56 @@ void startMessagePolling(int ent_type) { Get.find().getMessageStatus(); } } + _messageTimer = Timer.periodic(Duration(seconds: 10), (timer) async { try { if (ent_type == APPPackageType.MHT.code) { if (Get.isRegistered()) { - Get.find().getMessageStatus(); + final controller = Get.find(); + await controller.getMessageStatus(); + + if (controller.model.system_message_read == 1) { + await controller.getMessageList("app_system"); + + final unhandledShareMessages = + controller.systemMessageList.where((item) { + final data = item['data']; + final id = item['_id']?.toString(); + return data is Map && + data['type'] == 'share' && + id != null && + !_poppedMessageIds.contains(id) && + (item['read_time'] == null); + }).toList(); + + if (unhandledShareMessages.isNotEmpty) { + for (final message in unhandledShareMessages) { + final messageId = message['_id']?.toString(); + if (messageId == null || _poppedMessageIds.contains(messageId)) + continue; + + // 新增:如果当前页面是消息页,则跳过弹窗 + if (Get.currentRoute == '/messagePage') { + continue; + } + + _poppedMessageIds.add(messageId); + + try { + await controller.updateMessageReadStatus( + Get.context!, messageId); + } catch (e) { + print("标记消息 $messageId 为已读失败: $e"); + } + + final result = + await showMessageConfirmDialog(title: '设备分享提醒'.tr); + if (result == 'confirm') { + Get.toNamed('/messageDetail', arguments:message); + } + } + } + } } } else { if (Get.isRegistered()) { @@ -404,7 +451,7 @@ class MyApp extends StatelessWidget { Get.lazyPut(() => SleepingHabitController()), Get.lazyPut(() => PeopleInfoController()), Get.lazyPut(() => MainPageController()), - Get.lazyPut(() => MhMessageController()), + Get.lazyPut(() => AddressListController()), Get.lazyPut(() => AddressController()), // Get.lazyPut(() => MHLanguageController()), diff --git a/lib/pages/device_bind/componnet/bind_dialog.dart b/lib/pages/device_bind/componnet/bind_dialog.dart index b1be5db..fd6cafb 100644 --- a/lib/pages/device_bind/componnet/bind_dialog.dart +++ b/lib/pages/device_bind/componnet/bind_dialog.dart @@ -1467,12 +1467,10 @@ Future showDeleteDeviceConfirmDialog({ // }, // ); // } -Future showMessageConfirmDialog({ - required VoidCallback onConfirm, - required VoidCallback onCancel, +Future showMessageConfirmDialog({ required String title, }) async { - await Get.dialog( + return await Get.dialog( FrostedDialog( blurSigma: 3.0, child: Container( @@ -1491,10 +1489,7 @@ Future showMessageConfirmDialog({ children: [ Text( title, - style: TextStyle( - fontSize: 30.rpx, - color: Colors.black, - ), + style: TextStyle(fontSize: 30.rpx, color: Colors.black), ), const SizedBox(height: 12), RichText( @@ -1503,7 +1498,7 @@ Future showMessageConfirmDialog({ style: TextStyle(fontSize: 26.rpx, color: Colors.black87), children: [ TextSpan( - text: '有一条新的设备分享消息,'.tr, + text: '有一条新的设备分享消息'.tr, style: TextStyle(color: Colors.red, fontSize: 26.rpx)), ], ), @@ -1516,8 +1511,7 @@ Future showMessageConfirmDialog({ gradientDirection: GradientDirection.vertical, borderRadius: 16.rpx, onTap: () { - Get.back(); - onCancel(); + Get.back(result: 'cancel'); }, colors: [ Color(0xFF1592AA), @@ -1537,8 +1531,7 @@ Future showMessageConfirmDialog({ CustomCard( borderRadius: 16.rpx, onTap: () { - Get.back(); - onConfirm(); + Get.back(result: 'confirm'); }, colors: [ Color(0xFF1592AA), @@ -1562,8 +1555,6 @@ Future showMessageConfirmDialog({ ), ), ), - barrierDismissible: true, - // 监听返回或点击遮罩关闭事件 ); } diff --git a/lib/pages/mh_page/MhMessageList.dart b/lib/pages/mh_page/MhMessageList.dart index 8f59d61..94b4895 100644 --- a/lib/pages/mh_page/MhMessageList.dart +++ b/lib/pages/mh_page/MhMessageList.dart @@ -193,9 +193,9 @@ class _MhMessageListWidgetState extends State { child: Align( alignment: AlignmentDirectional(-1, 0), child: Text( + label.tr, overflow: TextOverflow.ellipsis, maxLines: 1, - label.tr, style: TextStyle( fontFamily: 'Inter', fontSize: 26.rpx, @@ -215,9 +215,9 @@ class _MhMessageListWidgetState extends State { child: Align( alignment: AlignmentDirectional(-1, 0), child: Text( + "${value}", overflow: TextOverflow.ellipsis, maxLines: 1, - "${value}", style: TextStyle( fontFamily: 'Inter', fontSize: 26.rpx, diff --git a/lib/pages/mh_page/Vital_signs_sensor.dart b/lib/pages/mh_page/Vital_signs_sensor.dart index baa9ba8..0d787c5 100644 --- a/lib/pages/mh_page/Vital_signs_sensor.dart +++ b/lib/pages/mh_page/Vital_signs_sensor.dart @@ -170,7 +170,7 @@ class VitalWidget extends StatelessWidget { children: [ Container( width: MediaQuery.sizeOf(context).width * 0.14, - constraints: BoxConstraints(minWidth: 106.rpx), + constraints: BoxConstraints(minWidth: 110.rpx), child: Text( "设备ID".tr, style: TextStyle( @@ -192,7 +192,7 @@ class VitalWidget extends StatelessWidget { children: [ Container( width: MediaQuery.sizeOf(context).width * 0.14, - constraints: BoxConstraints(minWidth: 106.rpx), + constraints: BoxConstraints(minWidth: 110.rpx), child: Text( "更新时间".tr, style: TextStyle( @@ -214,7 +214,7 @@ class VitalWidget extends StatelessWidget { children: [ Container( width: MediaQuery.sizeOf(context).width * 0.14, - constraints: BoxConstraints(minWidth: 106.rpx), + constraints: BoxConstraints(minWidth: 110.rpx), child: Text( "设备状态".tr, style: TextStyle( diff --git a/lib/pages/mh_page/apply_repair_page.dart b/lib/pages/mh_page/apply_repair_page.dart index 193f5b6..a1f4a5b 100644 --- a/lib/pages/mh_page/apply_repair_page.dart +++ b/lib/pages/mh_page/apply_repair_page.dart @@ -1959,9 +1959,9 @@ class ApplyRepairPage extends GetView { case 1: return '体征检测设备'.tr; case 2: - return '智能床'.tr; + return '智能电动床'.tr; case 3: - return '智能床垫'.tr; + return '律动智能床垫'.tr; default: return '未知设备'.tr; } diff --git a/lib/pages/mh_page/device_share_page.dart b/lib/pages/mh_page/device_share_page.dart index db8f563..f855821 100644 --- a/lib/pages/mh_page/device_share_page.dart +++ b/lib/pages/mh_page/device_share_page.dart @@ -43,465 +43,531 @@ class ShareDeviceWidget extends GetView { ), ), child: Scaffold( - appBar: AppBar( - backgroundColor: Colors.transparent, - automaticallyImplyLeading: false, - iconTheme: const IconThemeData(color: Colors.white), - titleSpacing: 0, - title: Container( - width: double.infinity, - height: 180.rpx, - child: Stack( - alignment: Alignment.center, - children: [ - // 中间居中的标题 - Text( - '分享设备'.tr, - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 30.rpx, - ), - ), - // 左侧图标 - Positioned( - left: 0.rpx, - child: returnIconButtomNew(), - ), - ], - ), - ), - actions: [], - centerTitle: false, - ), - key: scaffoldKey, + appBar: AppBar( backgroundColor: Colors.transparent, - body: SingleChildScrollView( - child: Container( - width: MediaQuery.sizeOf(context).width, - height: MediaQuery.sizeOf(context).height * 1, - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: EdgeInsetsDirectional.fromSTEB(0, 30.rpx, 0, 0), - child: Container( - width: MediaQuery.sizeOf(context).width, - decoration: BoxDecoration( - color: const Color(0xFF003058), - borderRadius: BorderRadius.circular(16.rpx), - ), - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 30.rpx, 49.rpx, 30.rpx, 80.rpx), - child: Column( + automaticallyImplyLeading: false, + iconTheme: const IconThemeData(color: Colors.white), + titleSpacing: 0, + title: Container( + width: double.infinity, + height: 180.rpx, + child: Stack( + alignment: Alignment.center, + children: [ + // 中间居中的标题 + Text( + '分享设备'.tr, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 30.rpx, + ), + ), + // 左侧图标 + Positioned( + left: 0.rpx, + child: returnIconButtomNew(), + ), + ], + ), + ), + actions: [], + centerTitle: false, + ), + key: scaffoldKey, + backgroundColor: Colors.transparent, + body: Container( + width: MediaQuery.sizeOf(context).width, + height: MediaQuery.sizeOf(context).height * 1, + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0, 30.rpx, 0, 0), + child: Container( + width: MediaQuery.sizeOf(context).width, + decoration: BoxDecoration( + color: const Color(0xFF003058), + borderRadius: BorderRadius.circular(16.rpx), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 30.rpx, 49.rpx, 30.rpx, 80.rpx), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, + Text( + '将以下设备分享给您的家人或朋友'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: Colors.white, + fontSize: 30.rpx, + letterSpacing: 0.0, + height: 1, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '将以下设备分享给您的家人或朋友'.tr, + "设备ID:".tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: const Color(0xFF6BFDAC), + fontSize: 26.rpx, + letterSpacing: 0.0, + height: 1), + ), + Text( + data['mac'], + style: TextStyle( + fontFamily: 'Readex Pro', + color: const Color(0xFF6BFDAC), + fontSize: 26.rpx, + letterSpacing: 0.0, + height: 1), + ), + ], + ) + ].divide(SizedBox(height: 65.rpx)), + ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0, 80.rpx, 0, 0), + child: Container( + width: MediaQuery.sizeOf(context).width, + constraints: const BoxConstraints( + minHeight: 46, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.rpx), + ), + child: Align( + alignment: const AlignmentDirectional(0, 0), + child: Form( + key: _formKey, + child: TextFormField( + controller: _phoneController, + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: '请输入对方手机号/邮箱号'.tr, + hintStyle: TextStyle( + fontFamily: 'Readex Pro', + color: const Color(0xFF929699), + fontSize: 36.rpx, + ), + enabledBorder: + const UnderlineInputBorder( + borderSide: BorderSide( + color: Color(0xFF929699), + width: 0), + ), + focusedBorder: + const UnderlineInputBorder( + borderSide: BorderSide( + color: Color(0xFF929699), + width: 0), + ), + errorBorder: const UnderlineInputBorder( + borderSide: BorderSide( + color: Colors.red, width: 0), + ), + focusedErrorBorder: + const UnderlineInputBorder( + borderSide: BorderSide( + color: Colors.redAccent, + width: 0), + ), + contentPadding: const EdgeInsets.only( + left: 10, bottom: 5), + ), + style: TextStyle( + fontFamily: 'Readex Pro', + color: Colors.white, + fontSize: 36.rpx, + ), + onChanged: (value) { + controller.model.account = value; + }, + ), + )), + ), + ), + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.transparent, + padding: EdgeInsets.only(top: 30.rpx), + onTap: () {}, + child: Container( + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide( + color: Color(0xFF85F5FF), + width: 0), // 下边线 + ), + ), + child: Text( + '点击复制APP下载链接'.tr, + style: TextStyle( + color: Color(0xFF85F5FF), // 蓝色文字 + + fontSize: 22.rpx, + ), + ), + )), + GestureDetector( + onTap: () { + // 当点击时,将 type 设置为 0(允许控制) + controller.model.type = 1; + controller.updateAll(); + }, + child: Container( + margin: EdgeInsets.only(top: 76.rpx), + width: MediaQuery.sizeOf(context).width, + constraints: const BoxConstraints( + minHeight: 46, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(0), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '允许对方控制和查看该设备'.tr, style: TextStyle( fontFamily: 'Readex Pro', color: Colors.white, - fontSize: 30.rpx, + fontSize: 26.rpx, letterSpacing: 0.0, - height: 1, ), ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "设备ID:".tr, - style: TextStyle( - fontFamily: 'Readex Pro', - color: const Color(0xFF6BFDAC), - fontSize: 26.rpx, - letterSpacing: 0.0, - height: 1), - ), - Text( - data['mac'], - style: TextStyle( - fontFamily: 'Readex Pro', - color: const Color(0xFF6BFDAC), - fontSize: 26.rpx, - letterSpacing: 0.0, - height: 1), - ), - ], - ) - ].divide(SizedBox(height: 65.rpx)), - ), - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 80.rpx, 0, 0), - child: Container( - width: MediaQuery.sizeOf(context).width, - constraints: const BoxConstraints( - minHeight: 46, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16.rpx), - ), - child: Align( - alignment: - const AlignmentDirectional(0, 0), - child: Form( - key: _formKey, - child: TextFormField( - controller: _phoneController, - textAlign: TextAlign.center, - decoration: InputDecoration( - hintText: '请输入对方手机号/邮箱号'.tr, - hintStyle: TextStyle( - fontFamily: 'Readex Pro', - color: const Color(0xFF929699), - fontSize: 36.rpx, - ), - enabledBorder: - const UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xFF929699), - width: 0), - ), - focusedBorder: - const UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xFF929699), - width: 0), - ), - errorBorder: - const UnderlineInputBorder( - borderSide: BorderSide( - color: Colors.red, width: 0), - ), - focusedErrorBorder: - const UnderlineInputBorder( - borderSide: BorderSide( - color: Colors.redAccent, - width: 0), - ), - contentPadding: - const EdgeInsets.only( - left: 10, bottom: 5), - ), - style: TextStyle( - fontFamily: 'Readex Pro', - color: Colors.white, - fontSize: 36.rpx, - ), - onChanged: (value) { - controller.model.account = value; - }, - ), - )), - ), - ), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: Colors.transparent, - padding: EdgeInsets.only(top: 30.rpx), - onTap: () {}, - child: Container( - decoration: const BoxDecoration( - border: Border( - bottom: BorderSide( - color: Color(0xFF85F5FF), - width: 0), // 下边线 - ), - ), - child: Text( - '点击复制APP下载链接'.tr, - style: TextStyle( - color: Color(0xFF85F5FF), // 蓝色文字 + Obx(() { + double h = 33.rpx; + bool check = controller.model.type == 1; - fontSize: 22.rpx, - ), - ), - )), - GestureDetector( - onTap: () { - // 当点击时,将 type 设置为 0(允许控制) - controller.model.type = 1; - controller.updateAll(); - }, - child: Container( - margin: EdgeInsets.only(top: 76.rpx), - width: MediaQuery.sizeOf(context).width, - constraints: const BoxConstraints( - minHeight: 46, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(0), - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - '允许对方控制和查看该设备'.tr, - style: TextStyle( - fontFamily: 'Readex Pro', - color: Colors.white, - fontSize: 26.rpx, - letterSpacing: 0.0, - ), - ), - Obx(() { - double h = 33.rpx; - bool check = controller.model.type == 1; - - return Container( - height: 33.rpx, - child: AspectRatio( - aspectRatio: 1, - child: Center( - child: Container( - height: h, - width: h, - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular( - h / 2), - border: Border.all( - width: check ? 1 : 0.5, - color: Color(0xFFC8CBD2), - ), - ), - child: check - ? Center( - child: ClipOval( - child: Container( - width: h * 0.6, - height: h * 0.6, - color: const Color( - 0xFF6BFDAC), - ), - ), - ) - : null, + return Container( + height: 33.rpx, + child: AspectRatio( + aspectRatio: 1, + child: Center( + child: Container( + height: h, + width: h, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(h / 2), + border: Border.all( + width: check ? 1 : 0.5, + color: Color(0xFFC8CBD2), ), ), + child: check + ? Center( + child: ClipOval( + child: Container( + width: h * 0.6, + height: h * 0.6, + color: const Color( + 0xFF6BFDAC), + ), + ), + ) + : null, ), - ); - }), - ], - ), - ), - ), - GestureDetector( - onTap: () { - controller.model.type = 2; - controller.updateAll(); - }, - child: Container( - width: MediaQuery.sizeOf(context).width, - constraints: - const BoxConstraints(minHeight: 46), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(0), - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - '仅允许对方查看该设备'.tr, - style: TextStyle( - fontFamily: 'Readex Pro', - color: Colors.white, - fontSize: 26.rpx, - letterSpacing: 0.0, ), ), - // ✅ 只包住响应式控件部分 - Obx(() { - double h = 33.rpx; - bool check = controller.model.type == 2; - - return Container( - height: 33.rpx, - child: AspectRatio( - aspectRatio: 1, - child: Center( - child: Container( - height: h, - width: h, - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular( - h / 2), - border: Border.all( - width: check ? 1 : 0.5, - color: Color(0xFFC8CBD2), - ), - ), - child: check - ? Center( - child: ClipOval( - child: Container( - width: h * 0.6, - height: h * 0.6, - color: const Color( - 0xFF6BFDAC), - ), - ), - ) - : null, - ), - ), - ), - ); - }), - ], - ), - ), - ), - Align( - alignment: const AlignmentDirectional(0, 0), - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 46.rpx, 0, 0), - child: Container( - width: 108, - height: 31, - decoration: BoxDecoration(), - child: FFButtonWidget( - onPressed: () async { - //todo 1:验证用户是否存在 2:发送邀请 - ApiResponse apiResponse = - await controller - .shareDevice(data['mac'.tr]); - if (apiResponse.code == - HttpStatusCodes.ok) { - TopSlideNotification.show(context, - text: apiResponse.msg!); - } else { - TopSlideNotification.show(context, - text: apiResponse.msg!, - textColor: themeController - .currentColor.sc9); - } - }, - text: '发送邀请'.tr, - options: FFButtonOptions( - height: 60.rpx, - padding: EdgeInsetsDirectional.fromSTEB( - 30.rpx, 0, 30.rpx, 0), - color: const Color(0xFF84F5FF), - textStyle: TextStyle( - fontFamily: 'Readex Pro', - color: Color(0xFF011D33), - fontSize: 26.rpx, - letterSpacing: 0.0, - ), - elevation: 0, - borderRadius: BorderRadius.circular(50), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ), - Expanded( - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 100.rpx, 0, 32.rpx), - child: Container( - width: MediaQuery.sizeOf(context).width, - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: const AlignmentDirectional(-1, 0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 14, 0, 0, 16), - child: Text( - '已分享用户'.tr, - style: TextStyle( - fontFamily: 'Readex Pro', - color: Colors.white, - fontSize: 30.rpx, - letterSpacing: 0.0, - height: 1), - ), - ), - ), - Obx( - () { - // 检查 shareUser 是否为空或数量为 0 - if (controller.model.shareUser == null || - controller.model.shareUser!.isEmpty) { - // return Container( - // alignment: AlignmentDirectional - // .centerStart, // 确保文字靠左对齐 - // padding: EdgeInsets.symmetric( - // horizontal: 16.0), // 根据需要设置内边距 - // child: Text( - // "暂无分享!", - // textAlign: TextAlign.left, // 文字左对齐 - // style: FlutterFlowTheme.of(context) - // .bodyMedium, // 可根据需要自定义样式 - // ), - // ); - return NullDataWidget(); - // EmptyMessageWidget( - // imagePath: - // "assets/images/emptyUser.png", - // ); - } - - // 否则显示正常的 ListView - return ListView( - controller: - scrollController, // 绑定 ScrollController - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: (controller.model.shareUser! - .asMap() - .entries - .map((e) => ShareUserWidget( - index: e.key, - mac: data['mac'.tr], - repairListController: - controller)) - .toList() as List) - // .divide(const SizedBox( - // height: 13, - // )) - .addToEnd(const SizedBox( - height: AppConstants.list_end_height, - )), ); - }, - ), - ], + }), + ], + ), ), ), - ), + GestureDetector( + onTap: () { + controller.model.type = 2; + controller.updateAll(); + }, + child: Container( + width: MediaQuery.sizeOf(context).width, + constraints: const BoxConstraints(minHeight: 46), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(0), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '仅允许对方查看该设备'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: Colors.white, + fontSize: 26.rpx, + letterSpacing: 0.0, + ), + ), + // ✅ 只包住响应式控件部分 + Obx(() { + double h = 33.rpx; + bool check = controller.model.type == 2; + + return Container( + height: 33.rpx, + child: AspectRatio( + aspectRatio: 1, + child: Center( + child: Container( + height: h, + width: h, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(h / 2), + border: Border.all( + width: check ? 1 : 0.5, + color: Color(0xFFC8CBD2), + ), + ), + child: check + ? Center( + child: ClipOval( + child: Container( + width: h * 0.6, + height: h * 0.6, + color: const Color( + 0xFF6BFDAC), + ), + ), + ) + : null, + ), + ), + ), + ); + }), + ], + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0, 0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 46.rpx, 0, 0), + child: Container( + width: 108, + height: 31, + decoration: BoxDecoration(), + child: FFButtonWidget( + onPressed: () async { + //todo 1:验证用户是否存在 2:发送邀请 + ApiResponse apiResponse = await controller + .shareDevice(data['mac'.tr]); + if (apiResponse.code == + HttpStatusCodes.ok) { + TopSlideNotification.show(context, + text: apiResponse.msg!); + } else { + TopSlideNotification.show(context, + text: apiResponse.msg!, + textColor: + themeController.currentColor.sc9); + } + }, + text: '发送邀请'.tr, + options: FFButtonOptions( + height: 60.rpx, + padding: EdgeInsetsDirectional.fromSTEB( + 30.rpx, 0, 30.rpx, 0), + color: const Color(0xFF84F5FF), + textStyle: TextStyle( + fontFamily: 'Readex Pro', + color: Color(0xFF011D33), + fontSize: 26.rpx, + letterSpacing: 0.0, + ), + elevation: 0, + borderRadius: BorderRadius.circular(50), + ), + ), + ), + ), + ), + ], ), ), - ], + ), ), - ), + // Expanded( + // child: Padding( + // padding: + // EdgeInsetsDirectional.fromSTEB(0, 100.rpx, 0, 32.rpx), + // child: Container( + // width: MediaQuery.sizeOf(context).width, + // child: SingleChildScrollView( + // child: Column( + // mainAxisSize: MainAxisSize.max, + // children: [ + // Align( + // alignment: const AlignmentDirectional(-1, 0), + // child: Padding( + // padding: const EdgeInsetsDirectional.fromSTEB( + // 14, 0, 0, 16), + // child: Text( + // '已分享用户'.tr, + // style: TextStyle( + // fontFamily: 'Readex Pro', + // color: Colors.white, + // fontSize: 30.rpx, + // letterSpacing: 0.0, + // height: 1), + // ), + // ), + // ), + // Obx( + // () { + // // 检查 shareUser 是否为空或数量为 0 + // if (controller.model.shareUser == null || + // controller.model.shareUser!.isEmpty) { + // return NullDataWidget(); + // // return SingleChildScrollView( + // // physics: + // // NeverScrollableScrollPhysics(), // 禁止滚动 + // // child: Center( + // // child: Padding( + // // padding: EdgeInsets.symmetric( + // // vertical: 60), + // // child: NullDataWidget(), + // // ), + // // ), + // // ); + // } + + // // 否则显示正常的 ListView + // return ListView( + // controller: + // scrollController, // 绑定 ScrollController + // shrinkWrap: true, + // scrollDirection: Axis.vertical, + // children: (controller.model.shareUser! + // .asMap() + // .entries + // .map((e) => ShareUserWidget( + // index: e.key, + // mac: data['mac'.tr], + // repairListController: controller)) + // .toList() as List) + // // .divide(const SizedBox( + // // height: 13, + // // )) + // .addToEnd(const SizedBox( + // height: AppConstants.list_end_height, + // )), + // ); + // }, + // ), + // ], + // ), + // ), + // ), + // ), + // ), + Expanded( + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0, 100.rpx, 0, 32.rpx), + child: Obx(() { + final shareUsers = controller.model.shareUser; + + // 无数据时,直接返回不带滚动的 Column + if (shareUsers == null || shareUsers.isEmpty) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Align( + alignment: AlignmentDirectional(-1, 0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 14, 0, 0, 16), + child: Text( + '已分享用户'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: Colors.white, + fontSize: 30.rpx, + letterSpacing: 0.0, + height: 1, + ), + ), + ), + ), + Expanded( + child: Center( + child: NullDataWidget(), + ), + ) + ], + ); + } + + // 有数据时,返回 ListView(可滚动) + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: AlignmentDirectional(-1, 0), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(14, 0, 0, 16), + child: Text( + '已分享用户'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: Colors.white, + fontSize: 30.rpx, + letterSpacing: 0.0, + height: 1, + ), + ), + ), + ), + Expanded( + child: ListView( + controller: scrollController, + padding: EdgeInsets.zero, + children: shareUsers + .asMap() + .entries + .map((e) => ShareUserWidget( + index: e.key, + mac: data['mac'.tr], + repairListController: controller, + )) + .toList() + .addToEnd(SizedBox( + height: AppConstants.list_end_height)), + ), + ), + ], + ); + }), + ), + ), + ], ), - )), + ), + ), + ), )); } } diff --git a/pubspec.lock b/pubspec.lock index 70b0f34..6d6e0d8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -795,10 +795,10 @@ packages: dependency: "direct main" description: name: fluwx - sha256: "46c78b678e2586ad21883dd1b1875b2f4548cf6bf52a388c839fe5d2a6a37e02" + sha256: "8dbbe3f2dd93cd5f689de7b1342b86a47db3f03005e2020904fc45a204d0df4f" url: "https://pub.flutter-io.cn" source: hosted - version: "5.7.1" + version: "5.5.2" font_awesome_flutter: dependency: transitive description: