import 'package:cpt_community/components/comments_dialog.dart'; import 'package:cpt_community/modules/community/following/following_vm.dart'; import 'package:cpt_community/modules/community/news/news_vm.dart'; import 'package:cpt_community/respository/common_garage.dart'; import 'package:cpt_community/respository/common_newsfeed.dart'; import 'package:cpt_community/router/page/community_page_router.dart'; import 'package:cs_resources/generated/assets.dart'; import 'package:cs_resources/theme/app_colors_theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:plugin_platform/engine/dialog/dialog_engine.dart'; import 'package:plugin_platform/engine/toast/toast_engine.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:router/path/router_path.dart'; import 'package:shared/utils/log_utils.dart'; import 'package:auto_route/auto_route.dart'; import 'package:widgets/dialog/app_custom_dialog.dart'; import 'package:widgets/my_checkbox_group.dart'; import '../garage/for_rent/for_rent_vm.dart'; import '../garage/for_sale/for_sale_vm.dart'; import '../garage/garagesale_post/garagesale_post_page.dart'; import '../my_following/my_following_page.dart'; import '../my_posts/my_posts_page.dart'; import 'community_page.dart'; import 'community_pageview_idx_data.dart'; import 'community_state.dart'; import 'foryou/foryou_vm.dart'; import 'news/news_state.dart'; import 'newsfeed_post/newsfeed_post_page.dart'; part 'community_vm.g.dart'; @riverpod class CommunityVm extends _$CommunityVm { get topSectionsData => state.topSectionsData; late CommonNewsFeedRepository commonNewsFeedRepositoryInstance; late CommonGarageRepository commonGarageRepositoryInstance; final Map providerMap = {}; // 根据索引获取 Provider ProviderBase getProvider(int index) { return providerMap[index]!; } CommunityVmState initState() { return CommunityVmState( currentCategoryIdx: 0, currentPageViewIdx: 0, lastGarageTabIdx: 0, lastNewsfeedTabIdx: 0, newsFeedTabsList: [ "News", "Following", "For You", ], garageSaleTabsList: [ "For Sale", "For Rent", ], ); } @override CommunityVmState build(){ // 引入数据仓库 commonNewsFeedRepositoryInstance = ref.read(commonNewsFeedRepositoryProvider); commonGarageRepositoryInstance = ref.read(commonGarageRepositoryProvider); final state = initState(); // 第一帧渲染完成 WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { // 存入 一组 pageView的 vm CommunityPageViewIdxData.values.forEach((key, value) { switch(key){ case 0: providerMap[key] = ref.read(newsVmProvider.notifier); break; case 1: providerMap[key] = ref.read(followingVmProvider.notifier); break; case 2: providerMap[key] = ref.read(foryouVmProvider.notifier); break; case 3: providerMap[key] = ref.read(forsaleVmProvider.notifier); break; case 4: providerMap[key] = ref.read(forrentVmProvider.notifier); } }); // 获取第一个 provider // final newsVmProvider = providerMap[0]['provider'] as AutoDisposeNotifierProviderImpl; // Log.d("444444 ${newsVmProvider}"); // ref.read(newsVmProvider.notifier).test(); }); Log.d("-------------community vm-------------build---------------------"); ref.onDispose((){ Log.d("-------------community vm-------------dispose---------------------"); }); return state; } tabsRouterChange(){ Log.d("----tabsRouterChange---${tabsRouterKey.currentState?.controller?.activeIndex}-"); state = state.copyWith(currentPageViewIdx: tabsRouterKey.currentState?.controller?.activeIndex ?? 0); } // 点击tab 切换tab handlerChangeTab(int tabIndex, TabsRouter? tabsRouter, int? categoryIdx) { tabsRouter = (tabsRouter?? tabsRouterKey.currentState?.controller)!; categoryIdx = categoryIdx ?? state.currentCategoryIdx; if(categoryIdx == 0){ tabsRouter.setActiveIndex(tabIndex); }else { tabsRouter.setActiveIndex(state.newsFeedTabsList!.length + tabIndex); } } // 获取当前pageView 的vm getCurrentPageViewVm(int? pageViewIdx){ if(pageViewIdx !=null){ return providerMap[pageViewIdx]; }else { return getCurrentPageViewVm(state.currentPageViewIdx); } } // 切换news feed和garage sale handlerSwitchNewsfeedOrGaragesale( int categoryIdx, BuildContext? context, TabsRouter? tabsRouter){ tabsRouter = (tabsRouter?? tabsRouterKey.currentState?.controller)!; categoryIdx = categoryIdx; if(categoryIdx == 0){ tabsRouter.setActiveIndex(state.lastNewsfeedTabIdx); }else if (categoryIdx == 1){ tabsRouter.setActiveIndex(state.newsFeedTabsList!.length + state.lastGarageTabIdx); } } // 设置当前的cat类型 setCurrentCategoryIdx(BuildContext? context, int categoryIdx, int? lastNewsfeedTabIdx, int? lastGarageTabIdx){ state = state.copyWith( currentCategoryIdx: categoryIdx, lastNewsfeedTabIdx: lastNewsfeedTabIdx?? state.lastNewsfeedTabIdx, lastGarageTabIdx: lastGarageTabIdx?? state.lastGarageTabIdx ); } // 返回当前 pageView 页面的 vm // 判断当前pageview 页面正处于显示状态 Future isCurrentPageViewShowing(int pageViewIdx) async{ // 延迟获取结果 bool isShowing = await Future.delayed(const Duration(milliseconds: 500), (){ return state.currentPageViewIdx == pageViewIdx; }); return isShowing; } // 获取garage sale 分类选项 Future getGarageSaleCategoryOptions() async{ final Map params = {}; final result = await commonGarageRepositoryInstance.fetchGarageCateGoryList(params); return result; } // 选择 garage sale 导航栏点击 选择分类 handlerChooseGarageCategory(BuildContext context) async { List> garageCategoryList = [ // { // 'id': '1', // 'name': 'Kids', // }, // { // 'id': '2', // 'name': 'Homeware', // }, // { // 'id': '3', // 'name': 'Fashion', // }, // { // 'id': '4', // 'name': 'Electronics', // }, // { // 'id': '5', // 'name': 'Sports', // }, // { // 'id': '6', // 'name': 'Furniture', // }, // { // 'id': '7', // 'name': 'Others', // }, ]; // 获取分类列表 try { final result = await getGarageSaleCategoryOptions(); if(result.isSuccess){ final listJson = result.getListJson(); // 将 listJson 转换为 List> garageCategoryList = (listJson as List?)?.map((item) => item as Map).toList() ?? []; state = state.copyWith( garageCategoryList: garageCategoryList ); await DialogEngine.show( tag: "chooseGarageSaleCategory", position: DialogPosition.center, widget: AppCustomDialog( message: '', dialogWidth: MediaQuery.of(context).size.width * 0.8, // contentBoxMaxHeight: 350, // contentBoxMinHeight: 300, isShowConfirmBtn: state.garageCategoryList!.length > 0 ? true: false, confirmTxt: "Ok", messageBuilder: (BuildContext context){ return Container( color: context.appColors.textWhite, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: state.garageCategoryList!.length > 0 ? [ MyCheckboxGroup( isSingleSelect: false, labelStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), items: state.garageCategoryList!, onChanged: (List> selectedItems){ Log.d("----MyCheckboxGroup onChanged $selectedItems"); } ) ]: [ Container( child: CircularProgressIndicator( strokeWidth: 3, valueColor: AlwaysStoppedAnimation(context.appColors.textDarkGray), ), ) ], ), ); }, isShowCancelBtn:false, confirmAction: (){ }, ) ); } }catch(error){ Log.d("---------------- $error"); } } // 点击了导航栏的 like btn handlerClickNavbarLikeBtn(BuildContext? context){ if(state.currentCategoryIdx ==0){ // ToastEngine.show("点击了 newsfeed like"); }else if(state.currentCategoryIdx == 1){ // ToastEngine.show("点击了 garagesale like"); } } // 点击了导航栏的 filter btn handlerClickNavbarFilterBtn(BuildContext? context,){ handlerChooseGarageCategory(context!); } // 点击发布的按钮 跳转到 newsfeed 发布的页面 void handlerGotoNewsfeedPost(BuildContext? context){ // AutoRouter.of(context).pushNamed(RouterPath.newsFeedPost); NewsfeedPostPage.startInstance(); // MyPostsPage.startInstance(); // MyFollowingPage.startInstance(); } // 点击发布的按钮 跳转到garagesale 发布的页面 void handlerGotoGaragePost(BuildContext? context){ int type = 1; CommunityPageViewIdxData.values.forEach((key, value){ if(value == "forSale" ){ if(state.currentPageViewIdx == key){ type = 1; } }else if(value == "forRent"){ if(state.currentPageViewIdx == key){ type = 2; } } }); GaragesalePostPage.startInstance(type: type); } }