property_news_vm.dart 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. import 'package:cpt_property/respository/property_resposity.dart';
  2. import 'package:domain/entity/property_news_entity.dart';
  3. import 'package:plugin_platform/http/http_result.dart';
  4. import 'package:riverpod_annotation/riverpod_annotation.dart';
  5. import 'package:shared/utils/log_utils.dart';
  6. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  7. import 'package:widgets/load_state_layout.dart';
  8. import 'package:widgets/widget_export.dart';
  9. import '../page/property_news_state.dart';
  10. part 'property_news_vm.g.dart';
  11. @riverpod
  12. class PropertyNewsVm extends _$PropertyNewsVm {
  13. late PropertyRespository propertyRespositoryInstance;
  14. bool _needShowPlaceholder = false; //是否展示LoadingView
  15. int _page = 1; // 当前页
  16. int _limit = 10; // 每页数量
  17. int _count = 0; // 总条数
  18. Map<String, dynamic> _newsQueryMap = {
  19. "isCollection": false,
  20. };
  21. // Refresh 控制器
  22. final EasyRefreshController refreshController = EasyRefreshController(
  23. controlFinishRefresh: true, //允许刷新
  24. controlFinishLoad: true, //允许加载
  25. );
  26. PropertyNewsState initState() {
  27. return PropertyNewsState(
  28. list: [],
  29. );
  30. }
  31. @override
  32. PropertyNewsState build() {
  33. // 引入数据仓库
  34. propertyRespositoryInstance = ref.read(propertyRespositoryProvider);
  35. // 初始化状态
  36. PropertyNewsState state = initState();
  37. // 初始化列表数据
  38. return state;
  39. }
  40. //刷新页面状态
  41. void changeLoadingState(LoadState loadState, String? errorMsg) {
  42. state = state.copyWith(
  43. loadingState: loadState,
  44. errorMessage: errorMsg
  45. );
  46. }
  47. // 初始化页面数据
  48. initPageData() {
  49. Log.d("----property_news_vm-----initPageData");
  50. onRefresh();
  51. }
  52. // 上拉加载 更多
  53. Future loadMore() async {
  54. Log.d("----property_news_vm-----loadMore");
  55. // await Future.delayed(const Duration(seconds: 2));
  56. // if(state.list.length >= _count){
  57. // return;
  58. // }else {
  59. // int page = _page + 1;
  60. // state = state.copyWith(page: page,);
  61. // getListData();
  62. // }
  63. // 检查 page 是否为 null,并初始化为 1
  64. _page++;
  65. getListData();
  66. }
  67. // 下拉刷新
  68. Future onRefresh() async {
  69. Log.d("----property_news_vm-----onRefresh ");
  70. // await Future.delayed(const Duration(seconds: 2));
  71. _page = 1;
  72. getListData();
  73. }
  74. // 重试请求
  75. Future retryRequest() async {
  76. _page = 1;
  77. _needShowPlaceholder = true;
  78. getListData();
  79. }
  80. // 获取list 列表数据
  81. Future getListData<T>() async {
  82. if (_needShowPlaceholder) {
  83. changeLoadingState(LoadState.State_Loading, null);
  84. }
  85. Log.d("加载listData数据---------------start--${_page}---");
  86. try {
  87. //请求网络
  88. Map<String, dynamic> params = {
  89. "isCollection": _newsQueryMap['isCollection'],
  90. "page": _page,
  91. "limit": _limit,
  92. };
  93. Log.d("请求参数------$params");
  94. final result = await propertyRespositoryInstance.fetchNewsList(params);
  95. //校验成功失败
  96. if (result.isSuccess) {
  97. handlerResultList((result.data as PropertyNewsEntity).list);
  98. } else {
  99. String errorMessage = result.errorMsg!;
  100. changeLoadingState(LoadState.State_Error, errorMessage);
  101. ToastEngine.show(result.errorMsg ?? "Network Load Error");
  102. }
  103. } catch (e) {
  104. ToastEngine.show("Error: $e");
  105. }
  106. // await Future.delayed(const Duration(milliseconds: 1500));
  107. // final List<Map<String, dynamic>> listData = [
  108. // {
  109. // "id": 1,
  110. // "title": "法国进口高档国家的看过艰苦奋斗是感觉扣税的房价过快岁的法国艰苦奋斗是架构开发更加开放的国际法的是",
  111. // "description": "fsklfdsk罚款乱收费上课了发送卡fsklfdsk罚款乱收费上课了发送卡fsklfdsk罚款乱收费上课了发送卡fsklfdsk罚款乱收费上课了发送卡fsklfdsk罚款乱收费上课了发送卡",
  112. // "time": "2024-02-15 12:00:00",
  113. // "isCollection": true,
  114. // "pic": "https://img1.baidu.com/it/u=2500825327,873404587&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500"
  115. // },
  116. // {
  117. // "id": 2,
  118. // "title": "JHKFDSAJKjfkdsfjkasjkjklfajfkajifwoqirujweiqofjndsaikfniasdhfiasdhfiadshfifjadslfjkdlsafjlkadsj",
  119. // "description": "oifosjf fjdskafj hjiwehfriohjfiash",
  120. // "time": "2024-10-16 12:00:00",
  121. // "isCollection": false,
  122. // "pic": ""
  123. // },
  124. // ];
  125. //
  126. // if (_page == 1) {
  127. // //刷新的方式
  128. // state = state.copyWith(list: listData);
  129. // refreshController.finishRefresh();
  130. // //更新展示的状态
  131. // changeLoadingState(LoadState.State_Success, null);
  132. // } else {
  133. // //加载更多
  134. // final allList = state.list;
  135. // if(allList.length >= _count! * _limit!){
  136. // //更新展示的状态
  137. // changeLoadingState(LoadState.State_Success, null);
  138. // refreshController.finishLoad(IndicatorResult.noMore);
  139. // }else {
  140. // allList.addAll(listData);
  141. // state = state.copyWith(list: allList);
  142. // refreshController.finishLoad();
  143. // }
  144. // }
  145. // // 最后赋值
  146. // _needShowPlaceholder = false;
  147. }
  148. void handlerResultList(List<PropertyNewsList>? list) {
  149. if (list != null && list.isNotEmpty) {
  150. //有数据,判断是刷新还是加载更多的数据
  151. if (_page == 1) {
  152. //刷新的方式
  153. state.list!.clear();
  154. state.list!.addAll(list.map((item)=> item.toJson()).toList());
  155. refreshController.finishRefresh();
  156. //更新展示的状态
  157. changeLoadingState(LoadState.State_Success, null);
  158. } else {
  159. //加载更多
  160. final allList = state.list;
  161. state = state.copyWith(list: allList);
  162. refreshController.finishLoad();
  163. // update();
  164. }
  165. } else {
  166. if (_page == 1) {
  167. //展示无数据的布局
  168. state.list!.clear();
  169. changeLoadingState(LoadState.State_Empty, null);
  170. refreshController.finishRefresh();
  171. } else {
  172. //展示加载完成,没有更多数据了
  173. if(state.list!.length == 0){
  174. changeLoadingState(LoadState.State_Empty, null);
  175. refreshController.finishLoad();
  176. }else {
  177. if(_needShowPlaceholder){
  178. changeLoadingState(LoadState.State_Success, null);
  179. }
  180. }
  181. //更新展示的状态
  182. refreshController.finishLoad(IndicatorResult.noMore);
  183. }
  184. }
  185. }
  186. // 去新闻详情页
  187. void goNewsDetail(String item) {
  188. Log.d("goNewsDetail");
  189. // PropertyPage.startInstance(context: context, item: item);
  190. }
  191. // 收藏/取消收藏
  192. void handlerCollection(curItem, bool liked) async {
  193. try {
  194. Map<String, dynamic> params = {
  195. "id": curItem['id'],
  196. };
  197. final result = await propertyRespositoryInstance.fetchPropertyNewsLikeClick(params);
  198. //校验成功失败
  199. if (result.isSuccess) {
  200. List<Map<String, dynamic>>? newList = state.list?.map((item) {
  201. if(item['id'] == curItem['id']){
  202. return {
  203. ...item,
  204. 'liked': !liked
  205. };
  206. }
  207. return item;
  208. }).toList();
  209. // Log.d("handlerCollection $newList");
  210. state = state.copyWith(list: newList);
  211. if(liked){
  212. ToastEngine.show("取消收藏");
  213. }else {
  214. ToastEngine.show("收藏成功");
  215. }
  216. } else {
  217. String errorMessage = result.errorMsg!;
  218. ToastEngine.show(errorMessage ?? "Network Load Error");
  219. }
  220. } catch (e) {
  221. ToastEngine.show("Error: $e");
  222. }
  223. }
  224. changeQueryMap(Map<String, dynamic> queryMap){
  225. _newsQueryMap = { ..._newsQueryMap, ...queryMap};
  226. }
  227. }