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_basic/constants/app_constant.dart'; import 'package:plugin_platform/engine/dialog/dialog_engine.dart'; import 'package:plugin_platform/engine/sp/sp_util.dart'; import 'package:plugin_platform/engine/toast/toast_engine.dart'; import 'package:riverpod_annotation/riverpod_annotation.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 '../../../respository/services_respository.dart'; import 'repair_page.dart'; import 'repair_pageview_idx_data.dart'; import 'repair_state.dart'; part 'repair_vm.g.dart'; @riverpod class RepairVm extends _$RepairVm { get topSectionsData => state.topSectionsData; late ServicesRespository repairRespositoryInstance; late Map providerMap = {}; bool _isSingleSelect = true; List> _currentSelectedGarageCategory = []; Map> _queryParams = {}; // 获取当前的查询参数 getCurrentQueryParams(String key) { return _queryParams[state.currentPageViewIdx]?[key]; } // 根据索引获取 Provider ProviderBase getProvider(int index) { return providerMap[index]!; } // 初始化 _queryParams queryParamsInit(){ List> repairEntriesList = RepairPageviewIdxData.values.entries.toList(); repairEntriesList.asMap().forEach((index, value) { _queryParams[index] = { 'keyword': null, 'is_liked': null, 'page_view_idx': index, 'page_view_name': value, }; }); } RepairVmState initState() { return RepairVmState( currentPageViewIdx: 0, ); } RepairVmState build(){ // 引入数据仓库 repairRespositoryInstance = ref.read(servicesRespositoryProvider); final state = initState(); queryParamsInit(); setCurrentPageViewIconStatus(); getPageViewVm(); Log.d("-------------repair vm-------------build---------------------"); ref.onDispose((){ providerMap = {}; Log.d("-------------repair vm-------------dispose---------------------"); }); return state; } // 搜集pageView 对应的vm void getPageViewVm(){ // 每次切换后需要重新获取 一组 pageView的 vm WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { // 存入 一组 pageView的 vm RepairPageviewIdxData.values.forEach((key, value) { switch(key){ case 0: case 1: case 2: // providerMap[key] = ref.read(forrentVmProvider.notifier); } }); }); } // 设置当前导航栏的 图标 等状态 void setCurrentPageViewIconStatus(){ WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { Log.d("获取当前的导航栏 相关状态resMap444 ${providerMap[state.currentPageViewIdx]} "); Map resMap = providerMap[state.currentPageViewIdx]?.getCurrentQueryParams(null)??{}; Log.d("获取当前的导航栏 相关状态resMap $resMap "); _queryParams[state.currentPageViewIdx] = resMap; }); } tabsRouterChange(){ // 设置当前导航栏的 图标 等状态 Log.d("----tabsRouterChange---${tabsRouterKey.currentState?.controller?.activeIndex}-"); state = state.copyWith(currentPageViewIdx: tabsRouterKey.currentState?.controller?.activeIndex ?? 0); setCurrentPageViewIconStatus(); getPageViewVm(); } handlerSwitchPageView(BuildContext? context, int pageViewIdx){ tabsRouterKey.currentState?.controller?.setActiveIndex(pageViewIdx); } // 获取当前pageView 的vm getCurrentPageViewVm(int? pageViewIdx){ if(pageViewIdx !=null){ return providerMap[pageViewIdx]; }else { return getCurrentPageViewVm(state.currentPageViewIdx); } } // 返回当前 pageView 页面的 vm // 判断当前pageview 页面正处于显示状态 Future isCurrentPageViewShowing(int pageViewIdx) async{ // 延迟获取结果 bool isShowing = await Future.delayed(const Duration(milliseconds: 500), (){ return state.currentPageViewIdx == pageViewIdx; }); return isShowing; } Future handlerShowChooseGarageCategoryDialog(BuildContext context, List> garageCategoryList) async{ await DialogEngine.show( tag: "chooseGarageSaleCategory", position: DialogPosition.center, widget: AppCustomDialog( message: '', dialogWidth: MediaQuery.of(context).size.width * 0.8, // contentBoxMaxHeight: 350, // contentBoxMinHeight: 300, isShowConfirmBtn: 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: garageCategoryList!.length > 0 ? [ MyCheckboxGroup( isSingleSelect: _isSingleSelect, labelStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), items: garageCategoryList!, defaultSelectedItems: [], onChanged: (List> selectedItems){ Log.d("----MyCheckboxGroup onChanged $selectedItems"); _currentSelectedGarageCategory = selectedItems; } ) ]: [ Container( child: CircularProgressIndicator( strokeWidth: 3, valueColor: AlwaysStoppedAnimation(context.appColors.textDarkGray), ), ) ], ), ); }, isShowCancelBtn:false, confirmAction: (){ // 点击了确定 Log.d("----点击了确定按钮"); int? categoryId; if(_isSingleSelect){ if(_currentSelectedGarageCategory.length > 0){ categoryId = _currentSelectedGarageCategory[0]['id']; } } providerMap[state.currentPageViewIdx] ..setCurrentQueryParams({ "category_id": _queryParams?[state.currentPageViewIdx]?['categoryId'], }) ..directRefresh(); }, ) ); } // 搜索 handlerSearch(String value){ Log.d("repair_vm 中 搜索 value: $value"); _queryParams?[state.currentPageViewIdx]?['keyword'] = value; providerMap[state.currentPageViewIdx] ..setCurrentQueryParams({ "keyword": _queryParams?[state.currentPageViewIdx]?['keyword'], }) ..directRefresh(); } // 点击了导航栏的 like btn handlerClickNavbarLikeBtn(BuildContext? context){ _queryParams[state.currentPageViewIdx]?['is_liked'] = !(_queryParams?[state.currentPageViewIdx]?['is_liked']??false); // 控制外层滚动和内层滚动 handlerNestedScrollViewScroll(); // providerMap[state.currentPageViewIdx] // ..setCurrentQueryParams({ // "is_liked": _queryParams?[state.currentPageViewIdx]?['is_liked'], // }) // ..directRefresh(); } handlerNestedScrollViewScroll({double? outerOffset, double? innerOffset=0.0, bool? isOuterScrollAnimated=false, bool? isInnerScrollAnimated=false}){ if(outerOffset !=null){ if(isOuterScrollAnimated!){ extendedNestedScrollViewKey.currentState?.outerController.animateTo( outerOffset, duration: const Duration(seconds: 1), curve: Curves.easeIn, ); }else { extendedNestedScrollViewKey.currentState?.outerController.jumpTo( outerOffset, ); } } if(innerOffset !=null){ extendedNestedScrollViewKey.currentState?.innerPositions.forEach((position) { if(isInnerScrollAnimated!){ position.animateTo(innerOffset, duration: Duration(seconds: 1), curve: Curves.easeIn); }else { position.jumpTo(innerOffset); } }); } } }