| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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<AnnouncementListPage> createState() => _AnnouncementListPageState();
- }
- class _AnnouncementListPageState extends ConsumerState<AnnouncementListPage> {
- 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: Align(
- alignment: Alignment.topCenter,
- 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)),
- ],
- ),
- ],
- ),
- );
- }
- }
|