import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:trackoffical_app/route.dart'; import 'package:trackoffical_app/service/app.dart'; import 'package:trackoffical_app/service/sport_wear.dart'; import 'package:trackoffical_app/utils.dart'; import 'package:trackoffical_app/pb.dart' as pb; import 'package:sensor/sensor.dart'; import '../../logger.dart'; import '../../model.dart'; import '../../model/map_info.dart'; import '../../service/api.dart'; // import '../activity_detail/activity_detail_view.dart'; import '../../widget/region_pick.dart'; // import '../game_history.dart'; import 'dialog_special_warn.dart'; enum HomePage{ discovery, personal, // gameHistory, } class HomeController extends GetxController{ final currentPage = HomePage.discovery.obs; final galleryData = pb.ActivityListReply().obs; final _userProfile = App.to.userProfile; Rx get username => _userProfile.username; Rx get head => _userProfile.head; final sex = App.to.userProfile.sex.obs; final age = App.to.userProfile.age.val.obs; final weightKg = App.to.userProfile.weightKg.val.obs; final heightCm = App.to.userProfile.heightCm.val.obs; final rhr = App.to.userProfile.rhr.val.obs; Function? disposeListenUserProfile; final _mapList = [].obs; final _mapRecommendList = [].obs; List get mapList{ final out = _mapRecommendList.toList(); out.addAll(_mapList.toList()); return out; } final mapInfoListScrollController = ScrollController(); final _api = ApiService.to; void toPage(HomePage page){ currentPage.value = page; } final isInGame = false.obs; final currentPageIndex = 0.obs; final gameHistory = [].obs; final SportWearService _sportWearService = Get.find(); SportWear? get connectedSportWear => _sportWearService.connectedSportWear.value; MPosition? get myPosition => App.to.position.value; final isLocating = false.obs; var regionMap = {}; final regionCode = ''.obs; String? get regionName => regionMap[regionCode.value]; var isMapGetMoreLoading=false; Future flushGalleryData() async{ final position = App.to.position.value; final value = await ApiService.to.activityList(position: position); galleryData.value = value; } void onClickActivity(pb.ActivitySimpleInfo data) { // Get.to( // () => const ActivityDetailView(), // binding: ActivityDetailView.bindings(), // arguments: data, // )?.then((value) => flushGalleryData()); } Future flushMapData() async{ final position = App.to.position.value; final recommend = await _api.mapRecommendList(position); _mapRecommendList.value = recommend; final l = await _api.mapList(position, 0, 8); _mapList.value = l; } Future mapGetMore() async{ if(isMapGetMoreLoading){ return; } isMapGetMoreLoading=true; tryCatchApi(()async{ final position = App.to.position.value; final l = await _api.mapList(position, _mapList.length, 8); _mapList.addAll(l); }, onFinally: (){ isMapGetMoreLoading=false; }); } onGameHistory()async{ // tryCatchApi(()async{ // final c = Get.find(); // currentPage.value = HomePage.gameHistory; // await c.flush(); // }, errTitle: ''); } onMaps()async{ tryCatchApi(()async{ flushMapData(); currentPage.value = HomePage.discovery; }, errTitle: ''); } onMy()async{ tryCatchApi(()async{ await ApiService.to.flushUserInfo(); currentPage.value = HomePage.personal; }, errTitle: ''); } _setRegionMap(){ final m = {}; final list = App.to.regionList; for (var element in list) { m[element.code] = element.name; } regionMap = m; } onClickSelectRegion()async{ var r = await RegionPick.show(App.to.regionList); if(r != null){ regionCode.value = r.code; } await flushGalleryData(); } Future reLocate({Duration? timeout}) async { isLocating.value = true; try { while(App.to.regionList.isEmpty){ try{ App.to.regionList.addAll(await ApiService.to.getRegionList()) ; _setRegionMap(); regionCode.value = await ApiService.to.getRegionCode(); break; }catch(e){ await Future.delayed(1.seconds); } } await App.to.getPosition(forceFlush: true, timeout: timeout); // var future = App.to.getPosition(forceFlush: true); // if (timeout != null){ // future = future.timeout(timeout); // } // // // final p = await future; await flushMapData(); } catch (e) { warn('定位失败:', e); } finally { App.to.isFirstLocating = false; isLocating.value = false; } } @override void onClose() { super.onClose(); mapInfoListScrollController.dispose(); disposeListenUserProfile?.call(); } @override void onReady() async{ await flushMapData(); if( App.to.isFirstLocating){ try{ await reLocate(timeout: 5.seconds); }catch(e){ warn('无法定位:', e); } } disposeListenUserProfile = GetStorage().listen(() { sex.value = _userProfile.sex; age.value = _userProfile.age.val; weightKg.value = _userProfile.weightKg.val; heightCm.value = _userProfile.heightCm.val; rhr.value = _userProfile.rhr.val; }); if(App.to.isShowHomeWarn&& App.to.userProfile.isEnableHomeSpecialWarn.val){ App.to.isShowHomeWarn=false; dialogHomeSpecialWarn(); } mapInfoListScrollController.addListener(() { if (mapInfoListScrollController.position.pixels == mapInfoListScrollController.position.maxScrollExtent) { //达到最大滚动位置 mapGetMore(); } }); } }