announcement_detail_page.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import '../../core/theme/app_colors.dart';
  4. import '../../core/utils/date_utils.dart' as du;
  5. import '../../core/utils/responsive.dart';
  6. import '../../shared/widgets/form_section.dart';
  7. import '../../shared/widgets/form_field_row.dart';
  8. import 'announcement_api.dart';
  9. import 'announcement_model.dart';
  10. final announcementDetailProvider = FutureProvider.autoDispose.family<AnnouncementModel, String>((ref, id) async {
  11. return ref.read(announcementApiProvider).fetchDetail(id);
  12. });
  13. class AnnouncementDetailPage extends ConsumerWidget {
  14. final String id;
  15. const AnnouncementDetailPage({super.key, required this.id});
  16. @override
  17. Widget build(BuildContext context, WidgetRef ref) {
  18. final detailAsync = ref.watch(announcementDetailProvider(id));
  19. final r = ResponsiveHelper.of(context);
  20. return Scaffold(
  21. appBar: AppBar(title: const Text('公告详情')),
  22. body: detailAsync.when(
  23. loading: () => const Center(child: CircularProgressIndicator()),
  24. error: (_, __) => const Center(child: Text('加载失败')),
  25. data: (item) => Center(
  26. child: ConstrainedBox(
  27. constraints: BoxConstraints(maxWidth: r.detailTwoColumns ? 700 : double.infinity),
  28. child: SingleChildScrollView(
  29. padding: const EdgeInsets.symmetric(vertical: 8),
  30. child: FormSection(
  31. title: item.title,
  32. children: [
  33. FormFieldRow(label: '发布部门', value: item.publisherName, showArrow: false),
  34. FormFieldRow(label: '发布时间', value: du.DateUtils.formatDate(item.publishTime), showArrow: false),
  35. FormFieldRow(label: '公告类型', value: item.type, showArrow: false),
  36. if (item.requireConfirm)
  37. FormFieldRow(label: '确认要求', value: '需确认已读', showArrow: false),
  38. FormFieldRow(label: '已读', value: '${item.readCount}人', showArrow: false),
  39. const Divider(),
  40. Padding(
  41. padding: const EdgeInsets.all(14),
  42. child: Text(item.content, style: const TextStyle(color: AppColors.textPrimary, fontSize: 14, height: 1.6)),
  43. ),
  44. ],
  45. ),
  46. ),
  47. ),
  48. ),
  49. ),
  50. );
  51. }
  52. }