today_track_helper.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import 'package:flutter_map/flutter_map.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import 'package:get/get_rx/src/rx_types/rx_types.dart';
  4. import 'package:injectable/injectable.dart';
  5. import 'package:location/data/consts/error_code.dart';
  6. import 'package:location/data/repositories/track_repository.dart';
  7. import 'package:location/di/get_it.dart';
  8. import 'package:location/handler/error_handler.dart';
  9. import 'package:location/utils/http_handler.dart';
  10. import 'package:location/utils/toast_util.dart';
  11. import '../../data/bean/atmob_track_point.dart';
  12. import '../../data/bean/track_daily_bean.dart';
  13. @lazySingleton
  14. class TodayTrackHelper {
  15. final RxMap<String, TodayTrackReportBean> todayTrackReportMap =
  16. <String, TodayTrackReportBean>{}.obs;
  17. final TrackRepository trackRepository;
  18. TodayTrackHelper(this.trackRepository);
  19. static TodayTrackHelper getInstance() {
  20. return getIt.get<TodayTrackHelper>();
  21. }
  22. void clear() {
  23. todayTrackReportMap.clear();
  24. }
  25. void requestTodayTrackReport(String userId) {
  26. todayTrackReportMap.putIfAbsent(userId, () => TodayTrackReportBean(userId));
  27. //确保一定有实例
  28. final reportBean = todayTrackReportMap[userId]!;
  29. if (reportBean.isRequesting) {
  30. // 正在请求中,跳过
  31. return;
  32. }
  33. if (reportBean.isRequestSuccess.value && !reportBean.isExpired) return;
  34. //重置数据
  35. reportBean.polylines = null;
  36. reportBean.markers = null;
  37. reportBean.trackPoints = null;
  38. reportBean.startPoint = null;
  39. reportBean.exceptionPoint = null;
  40. reportBean.isRequestSuccess.value = false;
  41. _requestTodayTrackReport(userId, reportBean);
  42. }
  43. void _requestTodayTrackReport(String userId, TodayTrackReportBean bean) {
  44. bean.isRequesting = true;
  45. trackRepository.trackDailyAction(userId).then((response) {
  46. bean.startPoint = response.startPoint;
  47. bean.exceptionPoint = response.exceptionPoint;
  48. bean.trackPoints = response.trackPoints;
  49. List<Marker> list = [];
  50. final startPoint = response.startPoint;
  51. if (startPoint != null && startPoint.addr?.isNotEmpty == true) {
  52. list.add(Marker(
  53. id: 'start',
  54. markerName: '',
  55. longitude: startPoint.lng,
  56. latitude: startPoint.lat,
  57. markerType: MarkerType.tracePassingPoint));
  58. }
  59. final exceptionPoint = response.exceptionPoint;
  60. if (exceptionPoint != null && exceptionPoint.addr?.isNotEmpty == true) {
  61. list.add(Marker(
  62. id: 'end',
  63. markerName: '',
  64. longitude: exceptionPoint.lng,
  65. latitude: exceptionPoint.lat,
  66. markerType: MarkerType.tracePassingPoint));
  67. }
  68. bean.markers = list;
  69. final points = response.trackPoints?.map((point) {
  70. return LatLng(latitude: point.latitude, longitude: point.latitude);
  71. }).toList();
  72. bean.polylines = [
  73. Polyline(
  74. lineId: 'small_trace',
  75. color: '#4476FF',
  76. width: 6.5,
  77. lineType: PolylineType.color,
  78. points: points ?? [])
  79. ];
  80. bean.isRequestSuccess.value = true;
  81. bean.lastRequestTime = DateTime.now();
  82. }).catchError((error) {
  83. if (error is ServerErrorException) {
  84. if (error.code == ErrorCode.noMember) {
  85. bean.noMember.value = true;
  86. }
  87. }
  88. ErrorHandler.toastError(error);
  89. }).whenComplete(() {
  90. bean.isRequesting = false;
  91. });
  92. }
  93. }
  94. class TodayTrackReportBean {
  95. final String userId;
  96. bool isRequesting = false;
  97. final RxBool isRequestSuccess = RxBool(false);
  98. final RxnBool noMember = RxnBool();
  99. TrackDailyBean? startPoint;
  100. TrackDailyBean? exceptionPoint;
  101. List<AtmobTrackPoint>? trackPoints;
  102. List<Polyline>? polylines;
  103. List<Marker>? markers;
  104. // 记录上一次请求成功的时间
  105. DateTime? lastRequestTime;
  106. TodayTrackReportBean(this.userId);
  107. MapPadding mapPadding =
  108. MapPadding(left: 10.w, right: 10.w, top: 10.w, bottom: 10.w);
  109. bool get isExpired {
  110. if (lastRequestTime == null) return true;
  111. return DateTime.now().difference(lastRequestTime!) >
  112. const Duration(minutes: 5);
  113. }
  114. }