| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- 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 = <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;
- var regionMap = <String, String>{};
- 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 = <String, String>{};
- final list = App.to.regionList;
- for (var element in list) {
- m[element.code] = element.name;
- }
- regionMap = m;
- }
- 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, 10);
- _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;
- });
- }
- 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();
- }
- @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();
- }
- });
- }
- }
|