import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../core/theme/app_colors.dart'; import '../../core/utils/date_utils.dart' as du; import '../../core/utils/responsive.dart'; import '../../shared/widgets/app_card.dart'; import '../../shared/widgets/empty_state.dart'; import '../../shared/widgets/loading_widget.dart'; import 'announcement_list_controller.dart'; import 'announcement_model.dart'; class AnnouncementListPage extends ConsumerStatefulWidget { const AnnouncementListPage({super.key}); @override ConsumerState createState() => _AnnouncementListPageState(); } class _AnnouncementListPageState extends ConsumerState { int _page = 1; @override Widget build(BuildContext context) { final itemsAsync = ref.watch(announcementListProvider(_page)); final r = ResponsiveHelper.of(context); return Scaffold( appBar: AppBar(title: const Text('公告通知')), body: Center( child: ConstrainedBox( constraints: BoxConstraints(maxWidth: r.listMaxWidth), child: itemsAsync.when( loading: () => const LoadingWidget(), error: (_, __) => const EmptyState(message: '加载失败'), data: (items) => items.isEmpty ? const EmptyState(message: '暂无公告') : ListView.builder( padding: const EdgeInsets.symmetric(vertical: 4), itemCount: items.length, itemBuilder: (_, index) => _buildItem(items[index]), ), ), ), ), ); } Widget _buildItem(AnnouncementModel item) { return AppCard( onTap: () => context.push('/announcement/detail/${item.id}'), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ if (item.isTop) const Text('📌 ', style: TextStyle(fontSize: 14)), Expanded( child: Text(item.title, style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 14, color: AppColors.textPrimary)), ), if (item.unreadCount > 0) Container( padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), decoration: BoxDecoration(color: AppColors.error, borderRadius: BorderRadius.circular(8)), child: Text('${item.unreadCount}未读', style: const TextStyle(color: Colors.white, fontSize: 10)), ), ], ), const SizedBox(height: 4), Text(item.content, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(color: AppColors.textSecondary, fontSize: 12)), const SizedBox(height: 4), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(item.publisherName, style: const TextStyle(color: AppColors.textHint, fontSize: 11)), Text(du.DateUtils.formatDate(item.publishTime), style: const TextStyle(color: AppColors.textHint, fontSize: 11)), ], ), ], ), ); } }