From daf782bf9f77f6ef817f8a9019ee62963c2c11c3 Mon Sep 17 00:00:00 2001 From: czz <862977248@qq.com> Date: Tue, 26 Aug 2025 17:56:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=88=86=E4=BA=AB=E5=92=8C?= =?UTF-8?q?=E8=A7=A3=E7=BB=91=E6=B6=88=E6=81=AF=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/langs/en_US.json | 3 +- assets/langs/zh_CN.json | 3 +- assets/langs/zh_TW.json | 3 +- .../message/message_controller.dart | 74 +++++- .../mh_controller/message_controller.dart | 37 +-- lib/main.dart | 225 +++++++++++++++++- .../device_bind/componnet/bind_dialog.dart | 49 ++-- lib/pages/main_bottom/message_page.dart | 57 +++-- lib/pages/mh_page/edit_address_page.dart | 4 +- lib/pages/mh_page/message_page.dart | 42 ++-- 10 files changed, 407 insertions(+), 90 deletions(-) diff --git a/assets/langs/en_US.json b/assets/langs/en_US.json index fc338e0..92efda0 100644 --- a/assets/langs/en_US.json +++ b/assets/langs/en_US.json @@ -540,5 +540,6 @@ "退出": "Exit", "同意": "Agree", "保存失败": "Save Failed", - "保存成功": "Save Successful" + "保存成功": "Save Successful", + "设备分享提醒": "Device Sharing Alert" } \ No newline at end of file diff --git a/assets/langs/zh_CN.json b/assets/langs/zh_CN.json index cb4d16f..14fe76a 100644 --- a/assets/langs/zh_CN.json +++ b/assets/langs/zh_CN.json @@ -543,5 +543,6 @@ "获取wifi列表成功": "获取wifi列表成功", "获取wifi列表失败": "获取wifi列表失败", "保存失败": "保存失败", - "保存成功": "保存成功" + "保存成功": "保存成功", + "设备分享提醒": "设备分享提醒" } \ No newline at end of file diff --git a/assets/langs/zh_TW.json b/assets/langs/zh_TW.json index 3e7d3d9..acbf652 100644 --- a/assets/langs/zh_TW.json +++ b/assets/langs/zh_TW.json @@ -537,5 +537,6 @@ "退出": "退出", "同意": "同意", "保存失败": "保存失敗", - "保存成功": "保存成功" + "保存成功": "保存成功", + "设备分享提醒":"設備分享提醒" } \ No newline at end of file diff --git a/lib/controller/message/message_controller.dart b/lib/controller/message/message_controller.dart index 445ea7b..9808f85 100644 --- a/lib/controller/message/message_controller.dart +++ b/lib/controller/message/message_controller.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:EasyDartModule/EasyDartModule.dart'; import 'package:ef/ef.dart'; +import 'package:flutter/material.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart'; @@ -9,6 +10,8 @@ import 'package:vbvs_app/common/color/appConstants.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/MyUtils.dart'; +import 'package:vbvs_app/common/util/requestWithLog.dart'; +import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/enum/APPPackageType.dart'; import 'package:vbvs_app/model/api_response.dart'; @@ -44,20 +47,36 @@ class MessageController extends GetControllerEx { RxList messageList = [].obs; - Future getMessageList({String? key}) async { + int bodyPage = 1; + int systemPage = 1; + + Future loadMore(String type) async { + if (type == "app_vsm") { + bodyPage++; + await getMessageList(key: "app_vsm", page: bodyPage, append: true); + } else { + systemPage++; + await getMessageList(key: "app_system", page: systemPage, append: true); + } + } + + Future getMessageList( + {String? key, int page = 1, int limit = 20, bool append = false}) async { try { ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.message_list; - String messageType = "app_system"; - if (model.type == 1) { + String messageType; + if (key != null && key.isNotEmpty) { + messageType = key; + } else if (model.type == 1) { messageType = "app_vsm"; } else { messageType = "app_system"; } String queryUrl = - "${serviceAddress}${serviceName}${serviceApi}?type=${messageType}"; + "${serviceAddress}${serviceName}${serviceApi}?type=${messageType}&page=$page&limit=$limit"; String? language = ""; if (AppConstants().ent_type == APPPackageType.MHT.code) { if (mhLanguageController.selectLanguage != null) { @@ -83,8 +102,12 @@ class MessageController extends GetControllerEx { ApiResponse.fromJson(responseData, (object) => object); MyUtils.formatResponse(res, "请求成功".tr, "请求失败".tr); if (res.code == HttpStatusCodes.ok) { + if (append) { + messageList.addAll(res.data ?? []); + } else { + messageList.assignAll(res.data ?? []); + } updateAll(); - messageList.value = res.data; return res; } } else { @@ -223,4 +246,45 @@ class MessageController extends GetControllerEx { return ApiResponse(code: -1, msg: "失败".tr); } } + + Future updateMessageReadStatus(BuildContext context, String messageType, + {String? mid, bool all = false}) async { + final serviceAddress = ServiceConstant.service_address; + final serviceName = ServiceConstant.server_service; + final serviceApi = ServiceConstant.message_read; + + // 构建 query 参数 + String queryUrl = + "$serviceAddress$serviceName$serviceApi?type=$messageType"; + if (all) { + queryUrl += "&mid=ALL"; + } else if (mid != null && mid.isNotEmpty) { + queryUrl += "&mid=$mid"; + } + + await requestWithLog( + logTitle: all ? '更新所有消息为已读' : '更新消息为已读', + method: MyHttpMethod.post, + queryUrl: queryUrl, + onSuccess: (res) { + if (res.code == HttpStatusCodes.ok) { + getMessageList(key: messageType); + getMessageStatus(); + + // ✅ 只有在 all 为 true 时才提示 + if (all) { + TopSlideNotification.show( + context, + text: res.msg!, + textColor: Color(0XFF00C1AA), + ); + } + } + }, + onFailure: (res) { + TopSlideNotification.show(context, + text: res.msg!, textColor: Color(0xFFFF7159)); + }, + ); + } } diff --git a/lib/controller/mh_controller/message_controller.dart b/lib/controller/mh_controller/message_controller.dart index e317616..7810eba 100644 --- a/lib/controller/mh_controller/message_controller.dart +++ b/lib/controller/mh_controller/message_controller.dart @@ -46,20 +46,28 @@ class MhMessageController extends GetControllerEx { RxList bodyMessageList = [].obs; RxList systemMessageList = [].obs; - Future getMessageList(String messageType) async { + int bodyPage = 1; + int systemPage = 1; + + Future loadMore(String type) async { + if (type == "app_vsm") { + bodyPage++; + await getMessageList("app_vsm", page: bodyPage, append: true); + } else { + systemPage++; + await getMessageList("app_system", page: systemPage, append: true); + } + } + + Future getMessageList(String messageType, + {int page = 1, int limit = 20, bool append = false}) async { try { ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr); String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.message_list; - // String messageType = "app_system"; - // if (model.type == 1) { - // messageType = "app_vsm"; - // } else { - // messageType = "app_system"; - // } String queryUrl = - "${serviceAddress}${serviceName}${serviceApi}?type=${messageType}"; + "${serviceAddress}${serviceName}${serviceApi}?type=${messageType}&page=$page&limit=$limit"; String? language = ""; if (mhLanguageController.selectLanguage != null) { language = mhLanguageController.selectLanguage.value!.language_code; @@ -78,22 +86,23 @@ class MhMessageController extends GetControllerEx { ApiResponse res = ApiResponse.fromJson(responseData, (object) => object); MyUtils.formatResponse(res, "请求成功".tr, "请求失败".tr); - if (res.code == HttpStatusCodes.ok) { - // updateAll(); - // messageList.value = res.data; - if (res.code == HttpStatusCodes.ok) { if (messageType == "app_vsm") { + if (append) { + bodyMessageList.addAll(res.data ?? []); + } else { bodyMessageList.assignAll(res.data ?? []); + } } else if (messageType == "app_system") { + if (append) { + systemMessageList.addAll(res.data ?? []); + } else { systemMessageList.assignAll(res.data ?? []); } } updateAll(); return res; } - } else { - return ApiResponse(code: -1, msg: "失败".tr); } return apiResponse; } catch (e) { diff --git a/lib/main.dart b/lib/main.dart index 1c347a3..a155a40 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -213,17 +213,18 @@ Timer? _messageTimer; // } Future startMessagePolling(int ent_type) async { Get.put(MhMessageController()); - MhMessageController messageController = Get.find(); + Get.put(MessageController()); + MessageController messageController = Get.find(); final Set _poppedMessageIds = {}; // 本地已弹窗的消息 ID(无论是否已读成功) final Set _readMessageIds = {}; final controller = Get.find(); _messageTimer?.cancel(); if (ent_type == APPPackageType.MHT.code) { if (Get.isRegistered()) { - Get.find().getMessageStatus(); await controller.getMessageStatus(); if (controller.model.system_message_read == 1) { - await controller.getMessageList("app_system"); + await controller.getMessageList("app_system", + page: 1, limit: 100, append: false); final unhandledShareMessages = controller.systemMessageList.where((item) { final data = item['data']; @@ -313,7 +314,113 @@ Future startMessagePolling(int ent_type) async { } } else { if (Get.isRegistered()) { - Get.find().getMessageStatus(); + await messageController.getMessageStatus(); + if (messageController.model.system_message_read == 1) { + await messageController.getMessageList( + key: "app_system", page: 1, limit: 100, append: false); + final unhandledShareMessages = + messageController.messageList.where((item) { + final data = item['data']; + final id = item['_id']?.toString(); + return data is Map && + (data['type'] == 'share' || data['type'] == 'unShare') && + 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; + } + + final data = message['data'] as Map; + final valList = data['val'] as List; + final messageType = data['type']; + + // Extract device ID + final deviceIdEntry = valList.firstWhere( + (item) => item['k'] == '设备ID', + orElse: () => null, + ); + final mac = deviceIdEntry?['v'] as String?; + _poppedMessageIds.add(messageId); + + try { + await controller.updateMessageReadStatus( + Get.context!, message['type'], + mid: messageId); + } catch (e) { + print("标记消息 $messageId 为已读失败: $e"); + } + + String dialogTitle; + String msg; + if (messageType == 'share') { + dialogTitle = '设备分享提醒'.tr; // "Device Sharing Notification" + final result = await showMessageConfirmDialog( + title: dialogTitle, + colorsList: [ + themeController.currentColor.sc1, + themeController.currentColor.sc2, + ], + backgroundColor: themeController.currentColor.sc17, + textColor: themeController.currentColor.sc3); + + if (result == 'confirm') { + messageController.model.type = 2; + Get.toNamed('/messagePage'); + } + } else { + dialogTitle = '设备解绑提醒'.tr; + showUnShareMessageDialog( + title: dialogTitle, + mac: mac!, + colorsList: [ + themeController.currentColor.sc1, + themeController.currentColor.sc2, + ], + backgroundColor: themeController.currentColor.sc17, + textColor: themeController.currentColor.sc3, + ); + } + } + try { + MHTHomeController homeController = Get.find(); + //更新设备列表 + homeController.getPersonList(); + //请求绑定设备列表 + // homeController.getSleepReport(); + homeController.getDeviceNum(); + homeController.getDeviceList(group: 'room').then((apiResponse) { + if (apiResponse.code != HttpStatusCodes.ok) { + try { + WebviewTestController webviewTestController = Get.find(); + webviewTestController.web.jsbridge?.dart.alterDevice(); + } catch (e) { + ef.log("[h5]通知列表更新报错:$e"); + } + } + }); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (homeController.homeSleepDays.value.isNotEmpty) { + homeController.selectedDayIndex.value = + homeController.homeSleepDays.value.length - 1; + } + }); + await homeController.getPersonList(); + } catch (e) { + ef.log("更新失败:$e"); + } + } + } } } @@ -324,7 +431,8 @@ Future startMessagePolling(int ent_type) async { await controller.getMessageStatus(); if (controller.model.system_message_read == 1) { - await controller.getMessageList("app_system"); + await controller.getMessageList("app_system", + page: 1, limit: 100, append: false); final unhandledShareMessages = controller.systemMessageList.where((item) { final data = item['data']; @@ -389,6 +497,113 @@ Future startMessagePolling(int ent_type) async { } else { if (Get.isRegistered()) { Get.find().getMessageStatus(); + if (messageController.model.system_message_read == 1) { + await messageController.getMessageList( + key: "app_system", page: 1, limit: 100, append: false); + final unhandledShareMessages = + messageController.messageList.where((item) { + final data = item['data']; + final id = item['_id']?.toString(); + return data is Map && + (data['type'] == 'share' || data['type'] == 'unShare') && + 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; + } + + final data = message['data'] as Map; + final valList = data['val'] as List; + final messageType = data['type']; + + // Extract device ID + final deviceIdEntry = valList.firstWhere( + (item) => item['k'] == '设备ID', + orElse: () => null, + ); + final mac = deviceIdEntry?['v'] as String?; + _poppedMessageIds.add(messageId); + + try { + await controller.updateMessageReadStatus( + Get.context!, message['type'], + mid: messageId); + } catch (e) { + print("标记消息 $messageId 为已读失败: $e"); + } + + String dialogTitle; + String msg; + if (messageType == 'share') { + dialogTitle = '设备分享提醒'.tr; // "Device Sharing Notification" + final result = await showMessageConfirmDialog( + title: dialogTitle, + colorsList: [ + themeController.currentColor.sc1, + themeController.currentColor.sc2, + ], + backgroundColor: themeController.currentColor.sc17, + textColor: themeController.currentColor.sc3); + + if (result == 'confirm') { + Get.toNamed( + '/messagePage', + ); + } + } else { + dialogTitle = '设备解绑提醒'.tr; + showUnShareMessageDialog( + title: dialogTitle, + mac: mac!, + colorsList: [ + themeController.currentColor.sc1, + themeController.currentColor.sc2, + ], + backgroundColor: themeController.currentColor.sc17, + textColor: themeController.currentColor.sc3, + ); + } + } + try { + MHTHomeController homeController = Get.find(); + //更新设备列表 + homeController.getPersonList(); + //请求绑定设备列表 + // homeController.getSleepReport(); + homeController.getDeviceNum(); + homeController.getDeviceList(group: 'room').then((apiResponse) { + if (apiResponse.code != HttpStatusCodes.ok) { + try { + WebviewTestController webviewTestController = Get.find(); + webviewTestController.web.jsbridge?.dart.alterDevice(); + } catch (e) { + ef.log("[h5]通知列表更新报错:$e"); + } + } + }); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (homeController.homeSleepDays.value.isNotEmpty) { + homeController.selectedDayIndex.value = + homeController.homeSleepDays.value.length - 1; + } + }); + await homeController.getPersonList(); + } catch (e) { + ef.log("更新失败:$e"); + } + } + } } } } catch (e) { diff --git a/lib/pages/device_bind/componnet/bind_dialog.dart b/lib/pages/device_bind/componnet/bind_dialog.dart index 0ffcdaa..4c77ab7 100644 --- a/lib/pages/device_bind/componnet/bind_dialog.dart +++ b/lib/pages/device_bind/componnet/bind_dialog.dart @@ -1469,6 +1469,13 @@ Future showDeleteDeviceConfirmDialog({ // } Future showMessageConfirmDialog({ required String title, + List colorsList = const [ + Color(0xFF1592AA), + Color(0XFF0C83A7), + Color(0XFF006FA3) + ], + Color backgroundColor = Colors.white, + Color textColor = Colors.black, }) async { return await Get.dialog( FrostedDialog( @@ -1477,7 +1484,7 @@ Future showMessageConfirmDialog({ width: 520.rpx, height: 460.rpx, decoration: BoxDecoration( - color: Colors.white, + color: backgroundColor, borderRadius: BorderRadius.circular(20.0), ), child: Padding( @@ -1489,18 +1496,18 @@ Future showMessageConfirmDialog({ children: [ Text( title, - style: TextStyle(fontSize: 30.rpx, color: Colors.black), + style: TextStyle(fontSize: 30.rpx, color: textColor), ), const SizedBox(height: 12), RichText( textAlign: TextAlign.center, text: TextSpan( - style: TextStyle(fontSize: 26.rpx, color: Colors.black87), + style: TextStyle(fontSize: 26.rpx, color: Colors.black), children: [ TextSpan( text: '有一条新的设备分享消息'.tr, style: - TextStyle(color: Colors.black, fontSize: 26.rpx)), + TextStyle(color: textColor, fontSize: 26.rpx)), ], ), ), @@ -1514,11 +1521,7 @@ Future showMessageConfirmDialog({ onTap: () { Get.back(result: 'cancel'); }, - colors: [ - Color(0xFF1592AA), - Color(0XFF0C83A7), - Color(0XFF006FA3) - ], + colors: colorsList, child: Container( width: 200.rpx, height: 90.rpx, @@ -1534,11 +1537,7 @@ Future showMessageConfirmDialog({ onTap: () { Get.back(result: 'confirm'); }, - colors: [ - Color(0xFF1592AA), - Color(0XFF0C83A7), - Color(0XFF006FA3) - ], + colors: colorsList, child: Container( width: 200.rpx, height: 90.rpx, @@ -1563,6 +1562,13 @@ Future showMessageConfirmDialog({ Future showUnShareMessageDialog({ required String title, required String mac, + List colorsList = const [ + Color(0xFF1592AA), + Color(0XFF0C83A7), + Color(0XFF006FA3) + ], + Color backgroundColor = Colors.white, + Color textColor = Colors.black, }) async { return await Get.dialog( FrostedDialog( @@ -1571,7 +1577,7 @@ Future showUnShareMessageDialog({ width: 520.rpx, height: 460.rpx, decoration: BoxDecoration( - color: Colors.white, + color: backgroundColor, borderRadius: BorderRadius.circular(20.0), ), child: Padding( @@ -1583,21 +1589,20 @@ Future showUnShareMessageDialog({ children: [ Text( title, - style: TextStyle(fontSize: 30.rpx, color: Colors.black), + style: TextStyle(fontSize: 30.rpx, color: textColor), ), const SizedBox(height: 12), RichText( textAlign: TextAlign.center, text: TextSpan( - style: TextStyle(fontSize: 26.rpx, color: Colors.black87), + style: TextStyle(fontSize: 26.rpx, color: Colors.black), children: [ TextSpan( text: mac, style: TextStyle(color: Colors.blue, fontSize: 26.rpx)), TextSpan( text: " " + '设备已被用户解绑,将取消当前分享!'.tr, - style: - TextStyle(color: Colors.black, fontSize: 26.rpx)), + style: TextStyle(color: textColor, fontSize: 26.rpx)), ], ), ), @@ -1610,11 +1615,7 @@ Future showUnShareMessageDialog({ onTap: () { Get.back(result: 'confirm'); }, - colors: [ - Color(0xFF1592AA), - Color(0XFF0C83A7), - Color(0XFF006FA3) - ], + colors: colorsList, child: Container( width: 200.rpx, height: 90.rpx, diff --git a/lib/pages/main_bottom/message_page.dart b/lib/pages/main_bottom/message_page.dart index aa8a0aa..98bba07 100644 --- a/lib/pages/main_bottom/message_page.dart +++ b/lib/pages/main_bottom/message_page.dart @@ -30,7 +30,7 @@ class _MessagePageState extends State { _pageController = PageController(initialPage: messageController.model.type == 1 ? 0 : 1); messageController.getMessageStatus(); - _fetchMessageData(); + // _fetchMessageData(); } void _fetchMessageData() { @@ -272,13 +272,13 @@ class _MessagePageState extends State { final list = messageController.messageList.value; return list.isEmpty ? const NullDataWidget() - : _buildMessageListView(list); + : _buildMessageListView(list, "app_vsm"); }), Obx(() { final list = messageController.messageList.value; return list.isEmpty ? const NullDataWidget() - : _buildMessageListView(list); + : _buildMessageListView(list, "app_system"); }), ], ), @@ -289,21 +289,42 @@ class _MessagePageState extends State { ); } - Widget _buildMessageListView(List dataList) { - return Container( - width: double.infinity, - padding: EdgeInsets.symmetric(horizontal: 30.rpx), - child: SingleChildScrollView( - child: Column( - children: [ - SizedBox(height: 30.rpx), - ...dataList - .map((item) => MessageWidgetWidget(data: item)) - .toList() - .divide(SizedBox(height: 30.rpx)), - SizedBox(height: 30.rpx), - ], - ), + // Widget _buildMessageListView(List dataList) { + // return Container( + // width: double.infinity, + // padding: EdgeInsets.symmetric(horizontal: 30.rpx), + // child: SingleChildScrollView( + // child: Column( + // children: [ + // SizedBox(height: 30.rpx), + // ...dataList + // .map((item) => MessageWidgetWidget(data: item)) + // .toList() + // .divide(SizedBox(height: 30.rpx)), + // SizedBox(height: 30.rpx), + // ], + // ), + // ), + // ); + // } + Widget _buildMessageListView(List dataList, String type) { + return NotificationListener( + onNotification: (scrollInfo) { + if (scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) { + // 滑到底部,加载下一页 + messageController.loadMore(type); + } + return true; + }, + child: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 30.rpx, vertical: 30.rpx), + itemCount: dataList.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(bottom: 30.rpx), + child: MessageWidgetWidget(data: dataList[index]), + ); + }, ), ); } diff --git a/lib/pages/mh_page/edit_address_page.dart b/lib/pages/mh_page/edit_address_page.dart index c08d821..2fd19f6 100644 --- a/lib/pages/mh_page/edit_address_page.dart +++ b/lib/pages/mh_page/edit_address_page.dart @@ -907,11 +907,11 @@ class EditAddressPage extends GetView TextFormField( // autofocus: true, onChanged: - (val) { + (value) { controller .model .address = - val; + value; }, initialValue: address[ diff --git a/lib/pages/mh_page/message_page.dart b/lib/pages/mh_page/message_page.dart index cadf6cf..3412724 100644 --- a/lib/pages/mh_page/message_page.dart +++ b/lib/pages/mh_page/message_page.dart @@ -182,13 +182,13 @@ class _MessagePageState extends State { final list = messageController.bodyMessageList; return list.isEmpty ? const NullDataWidget() - : _buildMessageListView(list); + : _buildMessageListView(list, "app_vsm"); }), Obx(() { final list = messageController.systemMessageList; return list.isEmpty ? const NullDataWidget() - : _buildMessageListView(list); + : _buildMessageListView(list, "app_system"); }), ], ), @@ -253,7 +253,7 @@ class _MessagePageState extends State { alignment: Alignment.center, child: Obx(() { return ClickableContainer( - padding: EdgeInsets.zero, + padding: EdgeInsets.symmetric(horizontal: 16.rpx, vertical: 8.rpx), backgroundColor: Colors.transparent, highlightColor: themeController.currentColor.sc21, borderRadius: 8.rpx, @@ -325,7 +325,7 @@ class _MessagePageState extends State { alignment: Alignment.center, child: Obx(() { return ClickableContainer( - padding: EdgeInsets.zero, + padding: EdgeInsets.symmetric(horizontal: 16.rpx, vertical: 8.rpx), backgroundColor: Colors.transparent, highlightColor: themeController.currentColor.sc21, borderRadius: 8.rpx, @@ -386,21 +386,25 @@ class _MessagePageState extends State { ); } - Widget _buildMessageListView(List dataList) { - return Container( - width: double.infinity, - padding: EdgeInsets.symmetric(horizontal: 30.rpx), - child: SingleChildScrollView( - child: Column( - children: [ - SizedBox(height: 30.rpx), - ...dataList - .map((item) => MhMessageListWidget(data: item)) - .toList() - .divide(SizedBox(height: 30.rpx)), - SizedBox(height: 30.rpx), - ], - ), + + Widget _buildMessageListView(List dataList, String type) { + return NotificationListener( + onNotification: (scrollInfo) { + if (scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) { + // 滑到底部,加载下一页 + messageController.loadMore(type); + } + return true; + }, + child: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 30.rpx, vertical: 30.rpx), + itemCount: dataList.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(bottom: 30.rpx), + child: MhMessageListWidget(data: dataList[index]), + ); + }, ), ); }