msg_center_page.dart 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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:news_app/constant/size_res.dart';
  6. import 'package:news_app/extension/base.dart';
  7. import 'package:news_app/provider/msg_center_provider.dart';
  8. import 'package:news_app/widget/empty_1_widget.dart';
  9. import 'package:news_app/widget/my_txt.dart';
  10. import '../../constant/color_res.dart';
  11. import '../../model/msg_center_model.dart';
  12. import '../topic/user_head_widget.dart';
  13. /// @author: bo.zeng
  14. /// @email: cnhbwds@gmail.com
  15. /// @date: 2025 2025/4/9 16:00
  16. /// @description:
  17. class MsgCenterPage extends StatefulWidget {
  18. const MsgCenterPage({super.key});
  19. @override
  20. State<MsgCenterPage> createState() => _MsgCenterPageState();
  21. }
  22. class _MsgCenterPageState extends State<MsgCenterPage> {
  23. @override
  24. Widget build(BuildContext context) {
  25. return DefaultTabController(
  26. length: 2,
  27. child: Scaffold(
  28. backgroundColor: Colors.white,
  29. appBar: AppBar(
  30. title: myTxt(
  31. text: "消息中心",
  32. fontSize: 18.sp,
  33. fontWeight: FontWeight.bold,
  34. ),
  35. // 移除阴影
  36. scrolledUnderElevation: 0,
  37. // 禁用滚动时的阴影变化
  38. backgroundColor: Colors.white,
  39. centerTitle: true,
  40. bottom: TabBar(
  41. tabAlignment: TabAlignment.center,
  42. isScrollable: false,
  43. indicatorColor: color2877FF,
  44. dividerHeight: 0,
  45. labelColor: color2877FF,
  46. // 选中标签颜色
  47. unselectedLabelColor: color7788A0,
  48. labelStyle: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
  49. unselectedLabelStyle: TextStyle(
  50. fontSize: 16.sp,
  51. fontWeight: FontWeight.bold,
  52. ),
  53. tabs: [Tab(text: "获回复"), Tab(text: "被点赞")],
  54. ),
  55. ),
  56. body: TabBarView(children: [_ReplyListPage(), _LikeListPage()]),
  57. ),
  58. );
  59. }
  60. }
  61. class _ReplyListPage extends ConsumerStatefulWidget {
  62. const _ReplyListPage();
  63. @override
  64. ConsumerState<_ReplyListPage> createState() => _ReplyListPageState();
  65. }
  66. final msgCenterProvider =
  67. NotifierProvider.family<MsgCenterLikeProvider, UserMsgLike, String>(() {
  68. return MsgCenterLikeProvider();
  69. });
  70. class _ReplyListPageState extends ConsumerState<_ReplyListPage> {
  71. int pageNum = 0;
  72. int total = 0;
  73. @override
  74. void initState() {
  75. super.initState();
  76. ref
  77. .read(msgCenterProvider("reply").notifier)
  78. .fetchMsgCenterLike(pageNum: pageNum);
  79. }
  80. @override
  81. Widget build(BuildContext context) {
  82. final replies = ref.watch(msgCenterProvider("reply"));
  83. ref.listen(msgCenterProvider("reply"), (pre, next) {
  84. total = next.rows?.length ?? 0;
  85. });
  86. return replies.rows?.isEmpty == true
  87. ? Empty1widget()
  88. : EasyRefresh.builder(
  89. onRefresh: () async {
  90. pageNum = 0;
  91. await ref
  92. .read(msgCenterProvider("reply").notifier)
  93. .fetchMsgCenterLike(pageNum: pageNum);
  94. return IndicatorResult.success;
  95. },
  96. onLoad: () async {
  97. if (total >= replies.total.safeValue) {
  98. return IndicatorResult.noMore;
  99. } else {
  100. pageNum++;
  101. await ref
  102. .read(msgCenterProvider("like").notifier)
  103. .fetchMsgCenterLike(pageNum: pageNum);
  104. return IndicatorResult.success;
  105. }
  106. },
  107. childBuilder: (context, py) {
  108. return ListView.separated(
  109. padding: EdgeInsets.symmetric(horizontal: horizontalPadding),
  110. itemBuilder: (BuildContext context, int index) {
  111. MsgCenterModelRows data =
  112. replies.rows?[index] ?? MsgCenterModelRows();
  113. return Padding(
  114. padding: EdgeInsets.symmetric(vertical: 12.h),
  115. child: Column(
  116. spacing: 5.h,
  117. crossAxisAlignment: CrossAxisAlignment.start,
  118. children: [
  119. Row(
  120. crossAxisAlignment: CrossAxisAlignment.center,
  121. spacing: 5.w,
  122. children: [
  123. CircleAvatar(
  124. radius: 11,
  125. backgroundImage: NetworkImage(
  126. data.fromMember?.avatar ?? "",
  127. ), // 替换为实际头像路径
  128. ),
  129. myTxt(
  130. text:
  131. "${data.fromMember?.nickname} 回复 ${data.toMember?.nickname}",
  132. fontSize: 15.sp,
  133. fontWeight: FontWeight.bold,
  134. ),
  135. ],
  136. ),
  137. Padding(
  138. padding: EdgeInsets.only(left: 32.w),
  139. child: myTxt(text: data.content ?? "", fontSize: 15.sp),
  140. ),
  141. Row(
  142. spacing: 20.w,
  143. children: [
  144. Padding(
  145. padding: EdgeInsets.only(left: 32.w),
  146. child: myTxt(
  147. text: data.createTime ?? "",
  148. fontSize: 12.sp,
  149. color: Colors.grey,
  150. ),
  151. ),
  152. ],
  153. ),
  154. ],
  155. ),
  156. );
  157. },
  158. separatorBuilder: (BuildContext context, int index) {
  159. return Divider(height: 0.5.h, color: Colors.grey[200]);
  160. },
  161. itemCount: replies.rows?.length ?? 0,
  162. );
  163. },
  164. );
  165. }
  166. }
  167. class _LikeListPage extends ConsumerStatefulWidget {
  168. const _LikeListPage();
  169. @override
  170. ConsumerState<_LikeListPage> createState() => _LikeListPageState();
  171. }
  172. class _LikeListPageState extends ConsumerState<_LikeListPage> {
  173. int pageNum = 0;
  174. int currentTotal = 0;
  175. @override
  176. void initState() {
  177. super.initState();
  178. ref
  179. .read(msgCenterProvider("like").notifier)
  180. .fetchMsgCenterLike(pageNum: pageNum);
  181. }
  182. @override
  183. Widget build(BuildContext context) {
  184. final likes = ref.watch(msgCenterProvider("like"));
  185. ref.listen(msgCenterProvider("like"), (pre, next) {
  186. currentTotal = next.rows?.length ?? 0;
  187. });
  188. return likes.rows?.isEmpty == true
  189. ? Empty1widget()
  190. : EasyRefresh.builder(
  191. onRefresh: () async {
  192. pageNum = 0;
  193. await ref
  194. .read(msgCenterProvider("like").notifier)
  195. .fetchMsgCenterLike(pageNum: pageNum);
  196. return IndicatorResult.success;
  197. },
  198. onLoad: () async {
  199. if (currentTotal >= likes.total.safeValue) {
  200. return IndicatorResult.noMore;
  201. } else {
  202. pageNum++;
  203. await ref
  204. .read(msgCenterProvider("like").notifier)
  205. .fetchMsgCenterLike(pageNum: pageNum);
  206. return IndicatorResult.success;
  207. }
  208. },
  209. childBuilder: (context, py) {
  210. return ListView.separated(
  211. padding: EdgeInsets.symmetric(horizontal: horizontalPadding),
  212. itemBuilder: (BuildContext context, int index) {
  213. MsgCenterModelRows data =
  214. likes.rows?[index] ?? MsgCenterModelRows();
  215. return Padding(
  216. padding: EdgeInsets.symmetric(vertical: 10.h),
  217. child: Column(
  218. crossAxisAlignment: CrossAxisAlignment.start,
  219. spacing: 5.h,
  220. children: [
  221. UserHeadWidget(
  222. nickname: data.fromMember?.nickname ?? "",
  223. avatar: data.fromMember?.avatar ?? "",
  224. time: data.createTime ?? "",
  225. ),
  226. myTxt(text: "赞了你的评论", fontSize: 14.sp),
  227. Container(
  228. color: colorF5F7FA,
  229. padding: EdgeInsets.all(10.w),
  230. alignment: Alignment.centerLeft,
  231. child: myTxt(
  232. text: data.relateContent ?? "",
  233. fontSize: 13.sp,
  234. color: color7788A0
  235. ),
  236. ),
  237. ],
  238. ),
  239. );
  240. },
  241. separatorBuilder: (BuildContext context, int index) {
  242. return SizedBox(height: 10.h);
  243. },
  244. itemCount: likes.rows?.length ?? 0,
  245. );
  246. },
  247. );
  248. }
  249. }