import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'controller.dart'; import 'model.dart'; class MessagePage extends GetView { const MessagePage({super.key}); @override Widget build(BuildContext context) { Get.put(MessageController()); return Scaffold( backgroundColor: const Color(0xFFF5F5F5), appBar: AppBar(title: const Text('消息通知'), centerTitle: true), body: Column( children: [ Expanded( child: Obx(() => SmartRefresher( controller: controller.refreshController, enablePullUp: true, onRefresh: controller.onRefresh, onLoading: controller.onLoading, child: ListView.separated( padding: const EdgeInsets.all(12), itemCount: controller.messageList.length, separatorBuilder: (_, __) => const SizedBox(height: 12), itemBuilder: (context, index) { return _buildMessageItem(context, controller.messageList[index]); }, ), )), ), Obx(() => !controller.allRead.value ? Container( padding: const EdgeInsets.all(16), color: Colors.white, child: ElevatedButton( onPressed: controller.markAllRead, style: ElevatedButton.styleFrom( backgroundColor: Colors.blue, minimumSize: const Size(double.infinity, 44), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: const Text('全部标为已读', style: TextStyle(fontSize: 16, color: Colors.white)), ), ) : const SizedBox.shrink()), ], ), ); } Widget _buildMessageItem(BuildContext context, MessageModel item) { return GestureDetector( onTap: () { controller.markRead(item); _showMessageDialog(context, item); }, child: Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( margin: const EdgeInsets.only(top: 6, right: 12), width: 8, height: 8, decoration: BoxDecoration( color: item.isRead == 1 ? Colors.grey[300] : const Color(0xFFFAAD14), shape: BoxShape.circle, ), ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( item.title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black87), ), const SizedBox(height: 8), Text( item.content, style: TextStyle(fontSize: 14, color: Colors.grey[600]), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 8), Text( item.createTime, style: TextStyle(fontSize: 12, color: Colors.grey[400]), ), ], ), ), ], ), ), ); } void _showMessageDialog(BuildContext context, MessageModel item) { showDialog( context: context, barrierDismissible: true, builder: (context) { return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), child: Container( padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( item.title, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 12), Text( item.content, style: const TextStyle(fontSize: 15, height: 1.5, color: Colors.black87), ), const SizedBox(height: 24), Align( alignment: Alignment.centerRight, child: OutlinedButton( onPressed: () => Navigator.pop(context), style: OutlinedButton.styleFrom( side: const BorderSide(color: Colors.blue), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8), ), child: const Text('确认', style: TextStyle(color: Colors.blue)), ), ), ], ), ), ); }, ); } }