topic_list_page.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import 'package:easy_refresh/easy_refresh.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:go_router/go_router.dart';
  6. import 'package:news_app/ui/topic/topic_item_widget.dart';
  7. import '../../constant/color_res.dart';
  8. import '../../constant/config.dart';
  9. import '../../constant/size_res.dart';
  10. import '../../model/topic_item_model.dart';
  11. import '../../provider/topic_list_provider.dart';
  12. import '../../widget/empty_1_widget.dart';
  13. import '../../widget/my_txt.dart';
  14. class TopicListPage extends ConsumerStatefulWidget {
  15. final String contentId;
  16. const TopicListPage({super.key, required this.contentId});
  17. @override
  18. ConsumerState<TopicListPage> createState() => _TopicListPageState();
  19. }
  20. final topicListProvider = NotifierProvider<TopicListProvider, TopicItemModel>(
  21. () => TopicListProvider(),
  22. );
  23. class _TopicListPageState extends ConsumerState<TopicListPage> {
  24. int _page = 1;
  25. int _currentTotal = 0;
  26. @override
  27. void initState() {
  28. // TODO: implement initState
  29. ref
  30. .read(topicListProvider.notifier)
  31. .fetchList(page: _page, tid: widget.contentId);
  32. eventBus.on<String>().listen((event) {
  33. if (event == "topicCall") {
  34. _page = 1;
  35. ref
  36. .read(topicListProvider.notifier)
  37. .fetchList(page: _page, tid: widget.contentId);
  38. }
  39. });
  40. super.initState();
  41. }
  42. void longTapAction(String contentId) {}
  43. @override
  44. Widget build(BuildContext context) {
  45. final itemData = ref.watch(topicListProvider);
  46. ref.listen(topicListProvider.select((p) => p.records), (previous, next) {
  47. _currentTotal = next?.length ?? 0;
  48. });
  49. return Scaffold(
  50. appBar: AppBar(
  51. scrolledUnderElevation: 0,
  52. title: myTxt(
  53. text: '话题列表',
  54. fontSize: 18.sp,
  55. fontWeight: FontWeight.bold,
  56. ),
  57. centerTitle: true,
  58. ),
  59. body: Container(
  60. // padding: EdgeInsets.symmetric(horizontal: 10.w),
  61. alignment: Alignment.center,
  62. color: colorF5F7FD,
  63. child: EasyRefresh.builder(
  64. onRefresh: () async {
  65. _page = 1;
  66. ref
  67. .read(topicListProvider.notifier)
  68. .fetchList(page: _page, tid: widget.contentId);
  69. return IndicatorResult.success;
  70. },
  71. onLoad: () async {
  72. final newItemData = ref.read(topicListProvider);
  73. int total = newItemData.total ?? 0;
  74. if (_currentTotal >= total) {
  75. return IndicatorResult.noMore;
  76. } else {
  77. _page += 1;
  78. await ref
  79. .read(topicListProvider.notifier)
  80. .fetchList(page: _page, tid: widget.contentId);
  81. return IndicatorResult.success;
  82. }
  83. },
  84. childBuilder: (context, py) {
  85. return (itemData.records ?? []).isEmpty
  86. ? Empty1widget()
  87. : ListView.separated(
  88. physics: py,
  89. padding: EdgeInsets.symmetric(horizontal: horizontalPadding),
  90. itemBuilder: (BuildContext context, int index) {
  91. return GestureDetector(
  92. onTap: () {
  93. context.push(
  94. "/topic/detail",
  95. extra: itemData.records?[index].contentId,
  96. );
  97. },
  98. child: Padding(
  99. padding: EdgeInsets.only(
  100. // left: horizontalPadding,
  101. // right: horizontalPadding,
  102. top: horizontalPadding,
  103. ),
  104. child: TopicItemWidget(
  105. longTapAction,
  106. item: itemData.records?[index],
  107. ),
  108. ),
  109. );
  110. },
  111. separatorBuilder: (BuildContext context, int index) {
  112. return SizedBox(height: 5.h);
  113. },
  114. itemCount: itemData.records?.length ?? 0,
  115. );
  116. },
  117. ),
  118. ),
  119. );
  120. }
  121. }