| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:qhd_prevention/customWidget/search_bar_widget.dart'; | 
					
						
							| 
									
										
										
										
											2025-08-07 17:33:16 +08:00
										 |  |  | import 'package:qhd_prevention/pages/badge_manager.dart'; | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | import 'package:qhd_prevention/pages/notif/notif_detail_page.dart'; | 
					
						
							|  |  |  | import 'package:qhd_prevention/tools/tools.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  | import '../../http/ApiService.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | class NotifPage extends StatefulWidget { | 
					
						
							|  |  |  |   const NotifPage({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   _NotifPageState createState() => _NotifPageState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  | class _NotifPageState extends State<NotifPage> | 
					
						
							|  |  |  |     with SingleTickerProviderStateMixin { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   final TextEditingController searchController = TextEditingController(); | 
					
						
							|  |  |  |   late List<dynamic> _list = []; | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |   late TabController _tabController; | 
					
						
							|  |  |  |   int _selectedTab = 0; | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |   int pageNum = 1; | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // 模拟数据
 | 
					
						
							|  |  |  |   final List<Map<String, dynamic>> _notifications = List.generate(10, (i) { | 
					
						
							|  |  |  |     bool read = i % 3 == 0; | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       'title': '测试数据标题标题 ${i + 1}', | 
					
						
							|  |  |  |       'time': '2025-06-${10 + i} 12:3${i}', | 
					
						
							|  |  |  |       'read': read, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void initState() { | 
					
						
							|  |  |  |     super.initState(); | 
					
						
							|  |  |  |     _tabController = TabController(length: 2, vsync: this); | 
					
						
							|  |  |  |     _tabController.addListener(() { | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |       // if (!_tabController.indexIsChanging) {
 | 
					
						
							|  |  |  |       //   setState(() => _selectedTab = _tabController.index);
 | 
					
						
							|  |  |  |       // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (_tabController.indexIsChanging) { | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |         setState(() => _selectedTab = _tabController.index); | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |         print('切换到标签:${_tabController.index}'); | 
					
						
							|  |  |  |         reRefreshData(); | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     _getNotifList(""); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void reRefreshData(){ | 
					
						
							|  |  |  |     pageNum=1; | 
					
						
							|  |  |  |     _list.clear(); | 
					
						
							|  |  |  |     searchController.text=""; | 
					
						
							|  |  |  |     if(0==_selectedTab){ | 
					
						
							|  |  |  |       _getNotifList(""); | 
					
						
							|  |  |  |     }else{ | 
					
						
							|  |  |  |       _getNotifEnterprise(""); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |   Future<void> _getNotifList(String keyWord) async { | 
					
						
							|  |  |  |     // LoadingDialogHelper.show(context);
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       final result = await ApiService.getNotifList("-1", pageNum.toString(),keyWord); | 
					
						
							|  |  |  |       if (result['result'] == 'success') { | 
					
						
							|  |  |  |         final List<dynamic> newList = result['varList'] ?? []; | 
					
						
							|  |  |  |         setState(() { | 
					
						
							|  |  |  |           _list.addAll(newList); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       print('加载出错: $e'); | 
					
						
							|  |  |  |     } finally { | 
					
						
							|  |  |  |       LoadingDialogHelper.hide(context); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> _getNotifEnterprise(String keyWord) async { | 
					
						
							|  |  |  |     // LoadingDialogHelper.show(context);
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       final result = await ApiService.getNotifEnterprise("-1", pageNum.toString(),keyWord); | 
					
						
							|  |  |  |       if (result['result'] == 'success') { | 
					
						
							|  |  |  |         final List<dynamic> newList = result['varList'] ?? []; | 
					
						
							|  |  |  |         setState(() { | 
					
						
							|  |  |  |           _list.addAll(newList); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       print('加载出错: $e'); | 
					
						
							|  |  |  |     } finally { | 
					
						
							|  |  |  |       LoadingDialogHelper.hide(context); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> _deleteNotif(String id) async { | 
					
						
							|  |  |  |     // LoadingDialogHelper.show(context);
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       final result = await ApiService.deleteNotif(id); | 
					
						
							|  |  |  |       if (result['result'] == 'success') { | 
					
						
							|  |  |  |         setState(() { | 
					
						
							|  |  |  |           reRefreshData(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       print('加载出错: $e'); | 
					
						
							|  |  |  |     } finally { | 
					
						
							|  |  |  |       LoadingDialogHelper.hide(context); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     _tabController.dispose(); | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return GestureDetector( | 
					
						
							|  |  |  |       onTap: () { | 
					
						
							|  |  |  |         FocusScope.of(context).unfocus(); // 收起键盘
 | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       behavior: HitTestBehavior.opaque, | 
					
						
							|  |  |  |       child: Scaffold( | 
					
						
							|  |  |  |         body: SafeArea( | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |           child: Column( | 
					
						
							|  |  |  |             children: [ | 
					
						
							|  |  |  |               // Tab bar
 | 
					
						
							|  |  |  |               TabBar( | 
					
						
							|  |  |  |                 controller: _tabController, | 
					
						
							|  |  |  |                 labelStyle: TextStyle(fontSize: 16), | 
					
						
							|  |  |  |                 indicator: UnderlineTabIndicator( | 
					
						
							|  |  |  |                   borderSide: BorderSide(width: 3.0, color: Colors.blue), | 
					
						
							|  |  |  |                   insets: EdgeInsets.symmetric(horizontal: 100.0), | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |                 labelColor: Colors.blue, | 
					
						
							|  |  |  |                 unselectedLabelColor: Colors.grey, | 
					
						
							|  |  |  |                 tabs: const [Tab(text: '政府公告'), Tab(text: '企业公告')], | 
					
						
							|  |  |  |               ), | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |               // Search bar
 | 
					
						
							|  |  |  |               Padding( | 
					
						
							|  |  |  |                 padding: const EdgeInsets.all(10), | 
					
						
							|  |  |  |                 child: SearchBarWidget( | 
					
						
							|  |  |  |                   key: Key("searchBody"), | 
					
						
							|  |  |  |                   controller: searchController, | 
					
						
							|  |  |  |                   onSearch: (keyword) { | 
					
						
							|  |  |  |                     print("用户输入的是: $keyword"); | 
					
						
							|  |  |  |                     // TODO: 执行搜索
 | 
					
						
							|  |  |  |                     // String word="整改";
 | 
					
						
							|  |  |  |                       pageNum=1; | 
					
						
							|  |  |  |                       _list.clear(); | 
					
						
							|  |  |  |                       if(0==_selectedTab){ | 
					
						
							|  |  |  |                         _getNotifList(keyword); | 
					
						
							|  |  |  |                       }else{ | 
					
						
							|  |  |  |                         _getNotifEnterprise(keyword); | 
					
						
							|  |  |  |                       } | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |                   }, | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |               ), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               // List
 | 
					
						
							|  |  |  |               Expanded( | 
					
						
							|  |  |  |                 child: | 
					
						
							|  |  |  |                     _list.isEmpty | 
					
						
							| 
									
										
										
										
											2025-07-28 14:22:07 +08:00
										 |  |  |                         ? NoDataWidget.show() | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |                         : ListView.builder( | 
					
						
							|  |  |  |                           itemCount: _list.length, | 
					
						
							|  |  |  |                           itemBuilder: (context, index) { | 
					
						
							|  |  |  |                             return _itemCell(_list[index]); | 
					
						
							|  |  |  |                           }, | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |           ), | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Widget _itemCell(final item) { | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |     return Column( | 
					
						
							|  |  |  |       children: [ | 
					
						
							|  |  |  |         ListTile( | 
					
						
							|  |  |  |           onTap: () { | 
					
						
							|  |  |  |             Navigator.push( | 
					
						
							|  |  |  |               context, | 
					
						
							|  |  |  |               MaterialPageRoute( | 
					
						
							|  |  |  |                 builder: (context) => NotifDetailPage( | 
					
						
							|  |  |  |                   item,_selectedTab, | 
					
						
							|  |  |  |                   onClose: (result) { | 
					
						
							|  |  |  |                     print('详情页面已关闭,返回结果: $result'); | 
					
						
							|  |  |  |                     reRefreshData(); | 
					
						
							|  |  |  |                   }, | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |             // pushPage(NotifDetailPage(item,_selectedTab), context);
 | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           contentPadding: const EdgeInsets.symmetric( | 
					
						
							|  |  |  |             horizontal: 16, | 
					
						
							|  |  |  |             vertical: 10, | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |           title: Padding( | 
					
						
							|  |  |  |             padding: const EdgeInsets.only(bottom: 20), // 减小底部间距
 | 
					
						
							|  |  |  |             child: Text(item['SYNOPSIS'], style: const TextStyle(fontSize: 14)), | 
					
						
							|  |  |  |           ), | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |           subtitle: Text(item['CREATTIME'], style: TextStyle(fontSize: 13)), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           trailing: Container( | 
					
						
							|  |  |  |             constraints: const BoxConstraints(minHeight: 100), // 确保最小高度
 | 
					
						
							|  |  |  |             child: Column( | 
					
						
							|  |  |  |               mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |               mainAxisSize: MainAxisSize.min, // 关键修改:使用最小尺寸
 | 
					
						
							|  |  |  |               crossAxisAlignment: CrossAxisAlignment.end, | 
					
						
							|  |  |  |               children: [ | 
					
						
							|  |  |  |                 if (0 != _selectedTab) | 
					
						
							|  |  |  |                   Text( | 
					
						
							|  |  |  |                     item['TYPE'] == 1 ? '已读' : '未读', | 
					
						
							|  |  |  |                     style: TextStyle( | 
					
						
							|  |  |  |                       fontSize: 12, // 稍微减小字体大小
 | 
					
						
							|  |  |  |                       color: item['TYPE'] == 1 ? Colors.grey : Colors.red, | 
					
						
							|  |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |                 SizedBox(height: 15), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (0 != _selectedTab && item['TYPE'] == 1) | 
					
						
							|  |  |  |                   SizedBox( | 
					
						
							|  |  |  |                     height: 24, // 固定按钮高度
 | 
					
						
							|  |  |  |                     child: TextButton( | 
					
						
							|  |  |  |                       onPressed: () async{ | 
					
						
							|  |  |  |                         // 显示确认对话框
 | 
					
						
							|  |  |  |                         bool? confirm = await showDialog( | 
					
						
							|  |  |  |                         context: context, | 
					
						
							|  |  |  |                         builder: (context) => AlertDialog( | 
					
						
							|  |  |  |                           title: Text("确认删除"), | 
					
						
							|  |  |  |                           content: Text("确定要删除这条通知吗?"), | 
					
						
							|  |  |  |                           actions: [ | 
					
						
							|  |  |  |                             TextButton( | 
					
						
							|  |  |  |                               onPressed: () => Navigator.pop(context, false), | 
					
						
							|  |  |  |                               // onPressed: () => Navigator.pop(context, false),
 | 
					
						
							|  |  |  |                               child: Text("取消"), | 
					
						
							|  |  |  |                             ), | 
					
						
							|  |  |  |                             TextButton( | 
					
						
							|  |  |  |                               onPressed: () => Navigator.pop(context, true), | 
					
						
							|  |  |  |                               // onPressed: () => Navigator.pop(context, true),
 | 
					
						
							|  |  |  |                               child: Text("确定", style: TextStyle(color: Colors.red)), | 
					
						
							|  |  |  |                             ), | 
					
						
							|  |  |  |                           ], | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         ); | 
					
						
							|  |  |  |                         if (confirm == true) { | 
					
						
							|  |  |  |                           _deleteNotif(item['NOTICECORPUSERID_ID']); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                       }, | 
					
						
							|  |  |  |                       style: TextButton.styleFrom( | 
					
						
							|  |  |  |                         padding: const EdgeInsets.symmetric(horizontal: 12), | 
					
						
							|  |  |  |                         backgroundColor: Colors.red, | 
					
						
							|  |  |  |                         shape: RoundedRectangleBorder( | 
					
						
							|  |  |  |                           borderRadius: BorderRadius.circular(12), | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       child: Text( '删除', style: TextStyle(fontSize: 13, color: Colors.white),), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ), | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  |         Divider(height: 1, color: Colors.black12), | 
					
						
							|  |  |  |       ], | 
					
						
							| 
									
										
										
										
											2025-07-11 11:03:21 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2025-07-16 18:07:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |