import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; import 'package:star_lock/mine/message/messageList/messageList_state.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/noData.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/EasyRefreshTool.dart'; import '../../../tools/dateTool.dart'; import '../../../tools/showTipView.dart'; import '../../../tools/storage.dart'; import '../../../tools/titleAppBar.dart'; import 'messageList_entity.dart'; import 'messageList_logic.dart'; class MessageListPage extends StatefulWidget { MessageListPage({Key? key, this.showAppBar = true}) : super(key: key); bool showAppBar; @override State createState() => _MessageListPageState(); } class _MessageListPageState extends State with TickerProviderStateMixin { final MessageListLogic logic = Get.put(MessageListLogic()); final MessageListState state = Get.find().state; // 修改 _showCheckboxes 状态变量为可观察状态 final RxBool _showCheckboxes = false.obs; // 添加选中状态 final RxList _selectedItems = [].obs; // 添加控制通知横幅显示的状态 bool showNotificationBanner = true; // 添加设置状态变量 final RxBool _pushNotificationEnabled = false.obs; // 删除方法 void deleteSelectedMessages() { final List selectedMessages = []; for (int i = 0; i < state.itemDataList.value.length; i++) { if (_selectedItems[i]) { selectedMessages.add(state.itemDataList.value[i]); } } // 调用删除接口 //logic.deletMessageDataRequest(selectedMessages); // 清空选中状态 _selectedItems.clear(); _selectedItems.addAll( List.generate(state.itemDataList.value.length, (index) => false)); _showCheckboxes.value = false; setState(() {}); } void getHttpData() { logic.messageListDataRequest().then((MessageListEntity value) { setState(() {}); }); } @override void initState() { super.initState(); // 获取当前消息推送设置状态 _loadPushNotificationStatus(); getHttpData(); } // 加载消息推送状态 void _loadPushNotificationStatus() async { final bool? enabled = await Storage.getBool('push_notification_enabled'); _pushNotificationEnabled.value = enabled ?? false; } //添加以时间分组的方法 Map> _groupMessagesByDate() { Map> grouped = {}; state.itemDataList.forEach((item) { String date = DateTool().dateToYMDString(item.createdAt!.toString()); if (!grouped.containsKey(date)) { grouped[date] = []; } grouped[date]!.add(item); }); return grouped; } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: widget.showAppBar ? TitleAppBar( barTitle: '消息'.tr, haveBack: true, actionsList: [ TextButton( child: Text( '清空'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { ShowTipView().showIosTipWithContentDialog('是否清空?'.tr, () async { logic.deletAllMessageDataRequest(); }); } else { logic.showToast('演示模式'.tr); } }, ), ], backgroundColor: AppColors.mainColor) : null, body: EasyRefreshTool(onRefresh: () { logic.pageNo = 1; getHttpData(); }, onLoad: () { getHttpData(); }, child: Obx(() { return state.itemDataList.value.isEmpty ? NoData() : Stack( children: [ Positioned( top: 0, left: 0, right: 0, child: Container( height: showNotificationBanner ? 100 : 70, child: Column(children: [ showNotificationBanner ? Container( padding: EdgeInsets.only(left: 10, right: 10), color: AppColors.messageTipsColor, height: 30, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('开启消息通知开关,及时获取通知', style: TextStyle( color: Colors.black, fontSize: 20.sp)), Row(children: [ !_pushNotificationEnabled.value ? GestureDetector(child: Text('去开启', style: TextStyle( color: Colors.blue, fontSize: 20.sp)), onTap: (){ Get.toNamed(Routers.mineSetPage); }) : SizedBox.shrink(), SizedBox(width: 10), InkWell( child: Image.asset( 'images/mine/icon_message_close.png', width: 24.w, height: 24.w), onTap: () { // 可以通过控制一个状态变量来隐藏整个通知栏 setState(() { showNotificationBanner = false; }); }), ]) ])) : SizedBox.shrink(), Container( padding: EdgeInsets.only(left: 15.w, right: 24.w, top: 20.h), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('告警', style: TextStyle( fontWeight: FontWeight.w600, fontSize: 30.sp)), ]), ) ]))), Container( padding: EdgeInsets.only( top: showNotificationBanner ? 80 : 50), child: ListView.builder( itemCount: _buildGroupedListItems().length, itemBuilder: (BuildContext context, int index) { var item = _buildGroupedListItems()[index]; if (item is String) { // 日期标题 return Container( padding: EdgeInsets.symmetric( horizontal: 16.w, vertical: 10.h), color: AppColors.mainBackgroundColor, child: RichText( text: TextSpan( children: [ TextSpan( text: item.substring(8, 10), style: TextStyle( color: Colors.black, fontSize: 36.sp, fontWeight: FontWeight.w600, ), ), TextSpan( text: ' ', ), TextSpan( text: item.substring(5, 7), style: TextStyle( color: Colors.grey, fontSize: 20.sp, fontWeight: FontWeight.w400), ), ], ), ), ); } else if (item is MessageItemEntity) { // 消息项 return _messageListItem(item, () { Get.toNamed(Routers.messageDetailPage, arguments: { 'messageItemEntity': item }); }); } return Container(); }, ), ), ], ); })), ); } // 构建分组列表 List _buildGroupedListItems() { List items = []; Map> grouped = _groupMessagesByDate(); grouped.forEach((date, messages) { items.add(date); // 添加日期标题 items.addAll(messages.map((message) => message)); // 添加该日期下的所有消息 }); // 初始化选中状态 if (_selectedItems.length != state.itemDataList.value.length) { _selectedItems.clear(); _selectedItems.addAll( List.generate(state.itemDataList.value.length, (index) => false)); } return items; } Widget _messageListItem( MessageItemEntity messageItemEntity, Function() action) { final int index = state.itemDataList.value.indexOf(messageItemEntity); // 查找当前消息在其所属日期分组中的位置 Map> grouped = _groupMessagesByDate(); bool isLastInGroupSimple = false; // 确定当前消息属于哪个日期分组 for (var entry in grouped.entries) { int messageIndex = entry.value.indexWhere((msg) => msg.id == messageItemEntity.id); if (messageIndex != -1) { // 如果是该分组的最后一条消息 isLastInGroupSimple = messageIndex == entry.value.length - 1; break; } } return GestureDetector( onTap: () { // 如果是多选模式,切换选中状态 if (_showCheckboxes.value) { _selectedItems[index] = !_selectedItems[index]; setState(() {}); } else { // 否则跳转到详情页 action(); } }, child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( padding: EdgeInsets.only(left: 10), transform: Matrix4.translationValues(0, 20, 0), child: Column( children: [ Image.asset( messageItemEntity.readAt! == 0 ? 'images/mine/icon_message_unread.png' : 'images/mine/icon_message_readed.png', width: 18.w, height: 18.h), // 添加竖线,根据是否是分组最后一条消息来决定是否显示 if (!isLastInGroupSimple) Container( width: 0.5, height: 120.h, color: Color.fromRGBO(0, 0, 0, 0.2), ) ], )), Expanded( child: Slidable( key: Key(messageItemEntity.id.toString()), // 为每个item添加唯一key endActionPane: ActionPane( motion: const ScrollMotion(), children: [ SlidableAction( onPressed: (context) { // 删除单条消息 logic.deletMessageDataRequest( messageItemEntity.id!, () { logic.pageNo = 1; getHttpData(); }); }, backgroundColor: Colors.red, foregroundColor: Colors.white, icon: Icons.delete, label: '删除', ), ], ), child: Container( width: 1.sw, margin: EdgeInsets.all(10.h), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10.w), ), child: Container( width: 1.sw, margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.h, bottom: 20.h), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Wrap( children: [ // 时间 Container( margin: EdgeInsets.only(top: 4.h), child: Text( DateTool().dateToHnString(messageItemEntity.createdAt!.toString()), style: TextStyle( fontSize: 20.sp, color: messageItemEntity.readAt! == 0 ? AppColors.blackColor : AppColors.placeholderTextColor, ), ), ), // 竖线 Container( width: 1, height: 10, margin: EdgeInsets.only(left: 5.w, right: 5.w, top: 10.h), color: messageItemEntity.readAt! == 0 ? AppColors.blackColor : AppColors.placeholderTextColor, ), // 标题 Container( margin: EdgeInsets.only(top: 2.h), child: Text('${messageItemEntity.data!}', maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 20.sp, color: messageItemEntity.readAt! == 0 ? AppColors.blackColor : AppColors.placeholderTextColor, ), )), Container(margin: EdgeInsets.only(top: 10.h), child: GestureDetector( child: Text('点击查看', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20.sp, color: AppColors.mainColor),), ),alignment: Alignment.centerRight,) ], ), ]))))), // 显示选中状态的复选框 if (_showCheckboxes.value) Checkbox( value: _selectedItems[index], activeColor: Colors.blue, onChanged: (val) { _selectedItems[index] = val!; setState(() {}); }, ) ])); } }