| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- 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<String> get username => _userProfile.username;
- Rx<MNetImage> 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 = <MapInfo>[].obs;
- final _mapRecommendList = <MapInfo>[].obs;
- List<MapInfo> 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 = <pb.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 = <String, String>{};
- final regionCode = ''.obs;
- String? get regionName => regionMap[regionCode.value];
- var isMapGetMoreLoading=false;
- Future<void> 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<void> 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<void> 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<GameHistoryController>();
- // 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 = <String, String>{};
- 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<void> 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();
- }
- });
- }
- }
|