import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../logger.dart'; import '../../model.dart'; import '../../service/api.dart'; import '../../service/app.dart'; import '../../utils.dart'; class MapListController extends GetxController{ 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; var regionMap = {}; final regionCode = ''.obs; String? get regionName => regionMap[regionCode.value]; var isMapGetMoreLoading = false; final isLocating = false.obs; MPosition? get myPosition => App.to.position.value; _setRegionMap(){ final m = {}; final list = App.to.regionList; for (var element in list) { m[element.code] = element.name; } regionMap = m; } 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, 10); _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; }); } 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(); } @override void onReady() async{ await flushMapData(); if(App.to.isFirstLocating){ try{ await reLocate(timeout: 5.seconds); }catch(e){ warn('无法定位:', e); } } mapInfoListScrollController.addListener(() { if (mapInfoListScrollController.position.pixels == mapInfoListScrollController.position.maxScrollExtent) { //达到最大滚动位置 mapGetMore(); } }); } }