map_list_controller.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 recommend = await _api.mapRecommendList(position);
  35. _mapRecommendList.value = recommend;
  36. final l = await _api.mapList(position, 0, 10);
  37. _mapList.value = l;
  38. }
  39. Future<void> mapGetMore() async{
  40. if(isMapGetMoreLoading){
  41. return;
  42. }
  43. isMapGetMoreLoading=true;
  44. tryCatchApi(()async{
  45. final position = App.to.position.value;
  46. final l = await _api.mapList(position, _mapList.length, 8);
  47. _mapList.addAll(l);
  48. }, onFinally: (){
  49. isMapGetMoreLoading=false;
  50. });
  51. }
  52. Future<void> reLocate({Duration? timeout}) async {
  53. isLocating.value = true;
  54. try {
  55. while(App.to.regionList.isEmpty){
  56. try{
  57. App.to.regionList.addAll(await ApiService.to.getRegionList()) ;
  58. _setRegionMap();
  59. regionCode.value = await ApiService.to.getRegionCode();
  60. break;
  61. }catch(e){
  62. await Future.delayed(1.seconds);
  63. }
  64. }
  65. await App.to.getPosition(forceFlush: true, timeout: timeout);
  66. // var future = App.to.getPosition(forceFlush: true);
  67. // if (timeout != null){
  68. // future = future.timeout(timeout);
  69. // }
  70. //
  71. //
  72. // final p = await future;
  73. await flushMapData();
  74. } catch (e) {
  75. warn('定位失败:', e);
  76. } finally {
  77. App.to.isFirstLocating = false;
  78. isLocating.value = false;
  79. }
  80. }
  81. @override
  82. void onClose() {
  83. super.onClose();
  84. mapInfoListScrollController.dispose();
  85. }
  86. @override
  87. void onReady() async{
  88. await flushMapData();
  89. if(App.to.isFirstLocating){
  90. try{
  91. await reLocate(timeout: 5.seconds);
  92. }catch(e){
  93. warn('无法定位:', e);
  94. }
  95. }
  96. mapInfoListScrollController.addListener(() {
  97. if (mapInfoListScrollController.position.pixels ==
  98. mapInfoListScrollController.position.maxScrollExtent) {
  99. //达到最大滚动位置
  100. mapGetMore();
  101. }
  102. });
  103. }
  104. }