notification_page.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import 'package:cpt_main/modules/feedback/create/feedback_create_page.dart';
  2. import 'package:cpt_main/modules/notification/item_notification_header.dart';
  3. import 'package:cpt_main/router/page/main_page_router.dart';
  4. import 'package:cs_resources/generated/l10n.dart';
  5. import 'package:cs_resources/theme/app_colors_theme.dart';
  6. import 'package:domain/entity/notification_page_entity.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:auto_route/auto_route.dart';
  9. import 'package:flutter_hooks/flutter_hooks.dart';
  10. import 'package:hooks_riverpod/hooks_riverpod.dart';
  11. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  12. import 'package:router/ext/auto_router_extensions.dart';
  13. import 'package:widgets/ext/ex_widget.dart';
  14. import 'package:widgets/load_state_layout.dart';
  15. import 'package:widgets/my_appbar.dart';
  16. import 'package:widgets/my_text_view.dart';
  17. import 'package:widgets/widget_export.dart';
  18. import 'item_notification.dart';
  19. import 'notification_view_model.dart';
  20. @RoutePage()
  21. class NotificationPage extends HookConsumerWidget {
  22. const NotificationPage({Key? key}) : super(key: key);
  23. static void startInstance({BuildContext? context}) {
  24. if (context != null) {
  25. context.router.push(const NotificationPageRoute());
  26. } else {
  27. appRouter.push(const NotificationPageRoute());
  28. }
  29. }
  30. @override
  31. Widget build(BuildContext context, WidgetRef ref) {
  32. final viewModel = ref.read(notificationViewModelProvider.notifier);
  33. final state = ref.watch(notificationViewModelProvider);
  34. useEffect(() {
  35. // 组件挂载时执行 - 执行接口请求
  36. Future.microtask(() => viewModel.fetchList());
  37. return () {
  38. // 组件卸载时执行
  39. };
  40. }, []);
  41. return Scaffold(
  42. appBar: MyAppBar.appBar(context, S.current.notification,
  43. backgroundColor: context.appColors.backgroundWhite,
  44. actions: [
  45. Center(
  46. child: MyTextView(
  47. S.current.mark_all,
  48. fontSize: 16,
  49. textColor: context.appColors.textPrimary,
  50. onClick: viewModel.markAll,
  51. isFontRegular: true,
  52. marginRight: 15,
  53. )),
  54. ],
  55. showBottomDivider: false),
  56. backgroundColor: context.appColors.backgroundWhite,
  57. body: SizedBox(
  58. width: double.infinity,
  59. height: double.infinity,
  60. child: EasyRefresh(
  61. controller: viewModel.refreshController,
  62. onRefresh: viewModel.onRefresh,
  63. onLoad: viewModel.loadMore,
  64. child: LoadStateLayout(
  65. state: state.loadingState,
  66. errorMessage: state.errorMessage,
  67. errorRetry: () {
  68. viewModel.retryRequest();
  69. },
  70. successSliverWidget: [
  71. SliverList(
  72. delegate: SliverChildBuilderDelegate(
  73. (context, index) {
  74. return StickyHeader(
  75. header: NotificationItemHeader(state.datas[index].groupId),
  76. content: Column(
  77. children: state.datas[index].groupDatas!.map((item) {
  78. return NotificationItem(item: item, index: index).onTap(() {
  79. viewModel.setReadStatus(item);
  80. });
  81. }).toList(),
  82. ),
  83. );
  84. },
  85. childCount: state.datas.length,
  86. )),
  87. ],
  88. ),
  89. ),
  90. ),
  91. );
  92. }
  93. }