map_list_controller.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import '../../logger.dart';
  4. import '../../model.dart';
  5. import '../../service/api.dart';
  6. import '../../service/app.dart';
  7. import '../../utils.dart';
  8. class MapListController extends GetxController{
  9. final _mapList = <MapInfo>[].obs;
  10. final _mapRecommendList = <MapInfo>[].obs;
  11. List<MapInfo> get mapList{
  12. final out = _mapRecommendList.toList();
  13. out.addAll(_mapList.toList());
  14. return out;
  15. }
  16. final mapInfoListScrollController = ScrollController();
  17. final _api = ApiService.to;
  18. var regionMap = <String, String>{};
  19. final regionCode = ''.obs;
  20. String? get regionName => regionMap[regionCode.value];
  21. var isMapGetMoreLoading = false;
  22. final isLocating = false.obs;
  23. MPosition? get myPosition => App.to.position.value;
  24. _setRegionMap(){
  25. final m = <String, String>{};
  26. final list = App.to.regionList;
  27. for (var element in list) {
  28. m[element.code] = element.name;
  29. }
  30. regionMap = m;
  31. }
  32. Future<void> flushMapData() async{
  33. final position = App.to.position.value;
  34. final l = await _api.mapList(position, 0, 10);
  35. _mapList.value = l;
  36. }
  37. Future<void> mapGetMore() async{
  38. if(isMapGetMoreLoading){
  39. return;
  40. }
  41. isMapGetMoreLoading=true;
  42. tryCatchApi(()async{
  43. final position = App.to.position.value;
  44. final l = await _api.mapList(position, _mapList.length, 8);
  45. _mapList.addAll(l);
  46. }, onFinally: (){
  47. isMapGetMoreLoading=false;
  48. });
  49. }
  50. Future<void> reLocate({Duration? timeout}) async {
  51. isLocating.value = true;
  52. try {
  53. // while(App.to.regionList.isEmpty){
  54. // try{
  55. // App.to.regionList.addAll(await ApiService.to.getRegionList()) ;
  56. // _setRegionMap();
  57. // regionCode.value = await ApiService.to.getRegionCode();
  58. // break;
  59. // }catch(e){
  60. // await Future.delayed(1.seconds);
  61. // }
  62. // }
  63. await App.to.getPosition(forceFlush: true, timeout: timeout);
  64. // var future = App.to.getPosition(forceFlush: true);
  65. // if (timeout != null){
  66. // future = future.timeout(timeout);
  67. // }
  68. //
  69. //
  70. // final p = await future;
  71. await flushMapData();
  72. } catch (e) {
  73. warn('定位失败:', e);
  74. } finally {
  75. App.to.isFirstLocating = false;
  76. isLocating.value = false;
  77. }
  78. }
  79. @override
  80. void onClose() {
  81. super.onClose();
  82. mapInfoListScrollController.dispose();
  83. }
  84. @override
  85. void onReady() async{
  86. await flushMapData();
  87. if(App.to.isFirstLocating){
  88. try{
  89. await reLocate(timeout: 5.seconds);
  90. }catch(e){
  91. warn('无法定位:', e);
  92. }
  93. }
  94. mapInfoListScrollController.addListener(() {
  95. if (mapInfoListScrollController.position.pixels ==
  96. mapInfoListScrollController.position.maxScrollExtent) {
  97. //达到最大滚动位置
  98. mapGetMore();
  99. }
  100. });
  101. }
  102. }