home_controller.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:get_storage/get_storage.dart';
  4. import 'package:trackoffical_app/route.dart';
  5. import 'package:trackoffical_app/service/app.dart';
  6. import 'package:trackoffical_app/service/sport_wear.dart';
  7. import 'package:trackoffical_app/utils.dart';
  8. import 'package:trackoffical_app/pb.dart' as pb;
  9. import 'package:sensor/sensor.dart';
  10. import '../../logger.dart';
  11. import '../../model.dart';
  12. import '../../model/map_info.dart';
  13. import '../../service/api.dart';
  14. // import '../activity_detail/activity_detail_view.dart';
  15. import '../../widget/region_pick.dart';
  16. // import '../game_history.dart';
  17. import 'dialog_special_warn.dart';
  18. enum HomePage{
  19. discovery,
  20. personal,
  21. // gameHistory,
  22. }
  23. class HomeController extends GetxController{
  24. final currentPage = HomePage.discovery.obs;
  25. final galleryData = pb.ActivityListReply().obs;
  26. final _userProfile = App.to.userProfile;
  27. Rx<String> get username => _userProfile.username;
  28. Rx<MNetImage> get head => _userProfile.head;
  29. final sex = App.to.userProfile.sex.obs;
  30. final age = App.to.userProfile.age.val.obs;
  31. final weightKg = App.to.userProfile.weightKg.val.obs;
  32. final heightCm = App.to.userProfile.heightCm.val.obs;
  33. final rhr = App.to.userProfile.rhr.val.obs;
  34. Function? disposeListenUserProfile;
  35. final _mapList = <MapInfo>[].obs;
  36. final _mapRecommendList = <MapInfo>[].obs;
  37. List<MapInfo> get mapList{
  38. final out = _mapRecommendList.toList();
  39. out.addAll(_mapList.toList());
  40. return out;
  41. }
  42. final mapInfoListScrollController = ScrollController();
  43. final _api = ApiService.to;
  44. void toPage(HomePage page){
  45. currentPage.value = page;
  46. }
  47. final isInGame = false.obs;
  48. final currentPageIndex = 0.obs;
  49. final gameHistory = <pb.GameHistory>[].obs;
  50. final SportWearService _sportWearService = Get.find();
  51. SportWear? get connectedSportWear => _sportWearService.connectedSportWear.value;
  52. MPosition? get myPosition => App.to.position.value;
  53. final isLocating = false.obs;
  54. var regionMap = <String, String>{};
  55. final regionCode = ''.obs;
  56. String? get regionName => regionMap[regionCode.value];
  57. var isMapGetMoreLoading=false;
  58. Future<void> flushGalleryData() async{
  59. final position = App.to.position.value;
  60. final value = await ApiService.to.activityList(position: position);
  61. galleryData.value = value;
  62. }
  63. void onClickActivity(pb.ActivitySimpleInfo data) {
  64. // Get.to(
  65. // () => const ActivityDetailView(),
  66. // binding: ActivityDetailView.bindings(),
  67. // arguments: data,
  68. // )?.then((value) => flushGalleryData());
  69. }
  70. Future<void> flushMapData() async{
  71. final position = App.to.position.value;
  72. final recommend = await _api.mapRecommendList(position);
  73. _mapRecommendList.value = recommend;
  74. final l = await _api.mapList(position, 0, 8);
  75. _mapList.value = l;
  76. }
  77. Future<void> mapGetMore() async{
  78. if(isMapGetMoreLoading){
  79. return;
  80. }
  81. isMapGetMoreLoading=true;
  82. tryCatchApi(()async{
  83. final position = App.to.position.value;
  84. final l = await _api.mapList(position, _mapList.length, 8);
  85. _mapList.addAll(l);
  86. }, onFinally: (){
  87. isMapGetMoreLoading=false;
  88. });
  89. }
  90. onGameHistory()async{
  91. // tryCatchApi(()async{
  92. // final c = Get.find<GameHistoryController>();
  93. // currentPage.value = HomePage.gameHistory;
  94. // await c.flush();
  95. // }, errTitle: '');
  96. }
  97. onMaps()async{
  98. tryCatchApi(()async{
  99. flushMapData();
  100. currentPage.value = HomePage.discovery;
  101. }, errTitle: '');
  102. }
  103. onMy()async{
  104. tryCatchApi(()async{
  105. await ApiService.to.flushUserInfo();
  106. currentPage.value = HomePage.personal;
  107. }, errTitle: '');
  108. }
  109. _setRegionMap(){
  110. final m = <String, String>{};
  111. final list = App.to.regionList;
  112. for (var element in list) {
  113. m[element.code] = element.name;
  114. }
  115. regionMap = m;
  116. }
  117. onClickSelectRegion()async{
  118. var r = await RegionPick.show(App.to.regionList);
  119. if(r != null){
  120. regionCode.value = r.code;
  121. }
  122. await flushGalleryData();
  123. }
  124. Future<void> reLocate({Duration? timeout}) async {
  125. isLocating.value = true;
  126. try {
  127. while(App.to.regionList.isEmpty){
  128. try{
  129. App.to.regionList.addAll(await ApiService.to.getRegionList()) ;
  130. _setRegionMap();
  131. regionCode.value = await ApiService.to.getRegionCode();
  132. break;
  133. }catch(e){
  134. await Future.delayed(1.seconds);
  135. }
  136. }
  137. await App.to.getPosition(forceFlush: true, timeout: timeout);
  138. // var future = App.to.getPosition(forceFlush: true);
  139. // if (timeout != null){
  140. // future = future.timeout(timeout);
  141. // }
  142. //
  143. //
  144. // final p = await future;
  145. await flushMapData();
  146. } catch (e) {
  147. warn('定位失败:', e);
  148. } finally {
  149. App.to.isFirstLocating = false;
  150. isLocating.value = false;
  151. }
  152. }
  153. @override
  154. void onClose() {
  155. super.onClose();
  156. mapInfoListScrollController.dispose();
  157. disposeListenUserProfile?.call();
  158. }
  159. @override
  160. void onReady() async{
  161. await flushMapData();
  162. if( App.to.isFirstLocating){
  163. try{
  164. await reLocate(timeout: 5.seconds);
  165. }catch(e){
  166. warn('无法定位:', e);
  167. }
  168. }
  169. disposeListenUserProfile = GetStorage().listen(() {
  170. sex.value = _userProfile.sex;
  171. age.value = _userProfile.age.val;
  172. weightKg.value = _userProfile.weightKg.val;
  173. heightCm.value = _userProfile.heightCm.val;
  174. rhr.value = _userProfile.rhr.val;
  175. });
  176. if(App.to.isShowHomeWarn&& App.to.userProfile.isEnableHomeSpecialWarn.val){
  177. App.to.isShowHomeWarn=false;
  178. dialogHomeSpecialWarn();
  179. }
  180. mapInfoListScrollController.addListener(() {
  181. if (mapInfoListScrollController.position.pixels ==
  182. mapInfoListScrollController.position.maxScrollExtent) {
  183. //达到最大滚动位置
  184. mapGetMore();
  185. }
  186. });
  187. }
  188. }