import 'package:cs_resources/generated/assets.dart'; import 'package:domain/entity/newsfeed_following_entity.dart'; import 'package:flutter/cupertino.dart'; import 'package:plugin_basic/provider/user_config/user_config_service.dart'; import 'package:plugin_platform/engine/toast/toast_engine.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:router/ext/auto_router_extensions.dart'; import 'package:shared/utils/ext_dart.dart'; import 'package:shared/utils/log_utils.dart'; import 'package:widgets/load_state_layout.dart'; import 'package:widgets/widget_export.dart'; import '../../../respository/common_newsfeed.dart'; import '../../../router/page/community_page_router.dart'; import '../community_pageview_idx_data.dart'; import '../community_vm.dart'; import 'following_state.dart'; part 'following_vm.g.dart'; @riverpod class FollowingVm extends _$FollowingVm { late CommonNewsFeedRespository commonNewsFeedRespositoryInstance; int _page = 1; // 当前页 int _limit = 10; // 每页数量 int _count = 0; // 总条数 Map _queryParams = { 'keyword': null, 'is_liked': null, }; bool _needShowPlaceholder = false; //是否展示LoadingView // Refresh 控制器 final EasyRefreshController refreshController = EasyRefreshController( controlFinishRefresh: true, //允许刷新 controlFinishLoad: true, //允许加载 ); FollowingState initState() { return FollowingState( list: [] ); } @override FollowingState build(){ // 引入数据仓库 commonNewsFeedRespositoryInstance = ref.read(commonNewsFeedRespositoryProvider); final state = initState(); Log.d("---------------following-----------build---------------------"); return state; } //刷新页面状态 void changeLoadingState(LoadState loadState, String? errorMsg) { state = state.copyWith( loadingState: loadState, errorMessage: errorMsg ); } // 初始化页面数据 initPageData() { Log.d("----following_vm-----initPageData ${state.loadingState}"); onRefresh(); } // 上拉加载 更多 Future loadMore() async { Log.d("----following_vm-----loadMore"); _page++; getListData(); } // 下拉刷新 Future onRefresh() async { // 当前pageView 页面正处于显示状态 Log.d("----following_vm-----onRefresh "); // await Future.delayed(const Duration(seconds: 2)); _page = 1; getListData(); } // 手动进行刷新 Future triggerRefresh() async { Log.d("trggerRefresh"); refreshController.callRefresh(); } // 手动进行刷新 Future directRefresh() async { state = state.copyWith(list:[]); // 注意:由于 nestedscrollview 嵌套easyfresh 组件 refreshController.callRefresh() 自动刷新只能滚动顶部但是不会触发下拉刷新,这里调用是 用到了将其滚动到顶部的作用,进而刷新操作主动掉接口 // https://github.com/xuelongqy/flutter_easy_refresh/issues/692 refreshController.callRefresh(); refreshController.resetFooter(); _page = 1; _needShowPlaceholder = true; getListData(); } // 重试请求 Future retryRequest() async { Log.d("重新加载数据---9999-----"); _page = 1; refreshController.resetFooter(); _needShowPlaceholder = false; getListData(); } // 获取list 列表数据 Future getListData() async { if (_needShowPlaceholder) { Log.d("修改加载状态---LoadState.State_Loading-----"); changeLoadingState(LoadState.State_Loading, null); } try { //请求网络 Map params = { "page": _page, "limit": _limit, }; Log.d("请求参数------$params"); final result = await commonNewsFeedRespositoryInstance.fetchFollowingList(params); //校验成功失败 if (result.isSuccess) { handlerResultList((result.data as NewsfeedFollowingEntity).list); } else { String errorMessage = result.errorMsg!; changeLoadingState(LoadState.State_Error, errorMessage); ToastEngine.show(result.errorMsg ?? "Network Load Error"); } } catch (e) { ToastEngine.show("Error: $e"); } // 最后赋值 _needShowPlaceholder = false; } void handlerResultList(List? list) { if (list != null && list.isNotEmpty) { //有数据,判断是刷新还是加载更多的数据 if (_page == 1) { //刷新的方式 state.list!.clear(); state.list!.addAll(list.map((item) => item.toJson()).toList()); refreshController.finishRefresh(); //更新展示的状态 changeLoadingState(LoadState.State_Success, null); } else { //加载更多 final allList = state.list; allList!.addAll(list.map((item) => item.toJson()).toList()); state = state.copyWith(list: allList); refreshController.finishLoad(); } } else { if (_page == 1) { //展示无数据的布局 state.list!.clear(); changeLoadingState(LoadState.State_Empty, null); refreshController.finishRefresh(); } else { //展示加载完成,没有更多数据了 if(state.list!.length == 0){ changeLoadingState(LoadState.State_Empty, null); refreshController.finishLoad(); }else { if(_needShowPlaceholder){ changeLoadingState(LoadState.State_Success, null); } } //更新展示的状态 refreshController.finishLoad(IndicatorResult.noMore); } } } // 点赞/取消点赞 Future handlerLikeClick(int id, bool isLike, int? itemidx) async { try { List> listCopyDta = List.from(state.list!); final result = await commonNewsFeedRespositoryInstance.fetchLikeClick({ "id": id, }); if (result.isSuccess) { if(itemidx != null){ // 修改 listCopyDta[itemIdx] 中的 like 状态 和 likes_count listCopyDta![itemidx]['liked'] = !isLike; if(isLike){ // 取消点赞 if(listCopyDta![itemidx]['likes_count']>0){ listCopyDta![itemidx]['likes_count'] = listCopyDta![itemidx]['likes_count'] - 1; } }else { listCopyDta![itemidx]['likes_count'] = listCopyDta![itemidx]['likes_count'] + 1; } }else { // 详情中的点赞 需要找到对应的 item 进行 修改 like 和 likes_count listCopyDta!.forEach((carditem) { if(carditem['id'] == id){ carditem['liked'] = !isLike; if(isLike){ // 取消点赞 if(carditem['likes_count']>0){ carditem['likes_count'] = carditem['likes_count'] - 1; } }else { carditem['likes_count'] = carditem['likes_count'] + 1; } } }); } state = state.copyWith(list: listCopyDta); final String toastMsg = isLike ? "Cancel successfully": "Liked successfully"; ToastEngine.show(toastMsg); return true; }else { return false; } }catch(error) { return false; } } // 点击 like comments share Future handlerClickActionBtn(String? actionStr, Map item, int itemidx) async{ final id = item['id']; final liked = item.getValue('liked', false); switch (actionStr) { case 'like': return await handlerLikeClick(id, liked, itemidx); case 'comments': Log.d("点击了 评论"); handlerGotoDetail(null, id); break; case 'share': Log.d("点击了 分享"); handlerGotoDetail(null, id); break; default: Log.d("点击了卡片"); handlerGotoDetail(null, id); break; } } // 关注/取消关注 Future handlerFollow(BuildContext? context, int to_user_id,int cardId, bool isFollow) async{ Log.d("点击了 关注"); try { final result = await commonNewsFeedRespositoryInstance.handlerFollowOrCancel({ "to_user_id": to_user_id, }); if(result.isSuccess){ // 修改cardId 对应的 card item 的 account 里面的 followed if(cardId!=null){ final listCopyDta = List>.from(state.list!); listCopyDta!.forEach((carditem) { if(carditem['id'] == cardId){ carditem['account']['followed'] = !carditem['account']['followed']; } }); state = state.copyWith(list: listCopyDta); } // 同步用户信息 UserConfigService.getInstance().refreshUserInfo(); return true; }else { return false; } }catch(error){ Log.d("error: $error"); return false; } } // 设置当前的 _queryParams setCurrentQueryParams(Map params){ _queryParams.addAll(params); } // 获取当前的 _queryParams Map getCurrentQueryParams(String? key){ if(key!=null && key!.isNotEmpty){ return _queryParams[key]; } return _queryParams; } // 去详情页面 void handlerGotoDetail(BuildContext? context, int id){ Log.d("去详情页面"); appRouter.push(NewsfeedDetailPageRoute(id: id, type:'following')); } }