today_track_helper.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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/repositories/track_repository.dart';
  6. import '../../data/bean/atmob_track_point.dart';
  7. import '../../data/bean/track_daily_bean.dart';
  8. @lazySingleton
  9. class TodayTrackHelper {
  10. final RxMap<String, TodayTrackReportBean> todayTrackReportMap =
  11. <String, TodayTrackReportBean>{}.obs;
  12. final TrackRepository trackRepository;
  13. TodayTrackHelper(this.trackRepository);
  14. void requestTodayTrackReport(String userId) {
  15. todayTrackReportMap.putIfAbsent(userId, () => TodayTrackReportBean(userId));
  16. //确保一定有实例
  17. final reportBean = todayTrackReportMap[userId]!;
  18. if (reportBean.isRequesting) {
  19. // 正在请求中,跳过
  20. return;
  21. }
  22. if (reportBean.isRequestSuccess.value && !reportBean.isExpired) return;
  23. //重置数据
  24. reportBean.polylines = null;
  25. reportBean.markers = null;
  26. reportBean.trackPoints = null;
  27. reportBean.startPoint = null;
  28. reportBean.exceptionPoint = null;
  29. reportBean.isRequestSuccess.value = false;
  30. _requestTodayTrackReport(userId, reportBean);
  31. }
  32. void _requestTodayTrackReport(String userId, TodayTrackReportBean bean) {
  33. bean.isRequesting = true;
  34. trackRepository.trackDailyAction(userId).then((response) {
  35. bean.startPoint = response.startPoint;
  36. bean.exceptionPoint = response.exceptionPoint;
  37. bean.trackPoints = response.trackPoints;
  38. List<Marker> list = [];
  39. final startPoint = response.startPoint;
  40. if (startPoint != null && startPoint.addr?.isNotEmpty == true) {
  41. list.add(Marker(
  42. id: 'start',
  43. markerName: '',
  44. longitude: startPoint.lng,
  45. latitude: startPoint.lat,
  46. markerType: MarkerType.tracePassingPoint));
  47. }
  48. final exceptionPoint = response.exceptionPoint;
  49. if (exceptionPoint != null && exceptionPoint.addr?.isNotEmpty == true) {
  50. list.add(Marker(
  51. id: 'end',
  52. markerName: '',
  53. longitude: exceptionPoint.lng,
  54. latitude: exceptionPoint.lat,
  55. markerType: MarkerType.tracePassingPoint));
  56. }
  57. bean.markers = list;
  58. final points = response.trackPoints?.map((point) {
  59. return LatLng(latitude: point.latitude, longitude: point.latitude);
  60. }).toList();
  61. bean.polylines = [
  62. Polyline(
  63. lineId: 'small_trace',
  64. color: '#4476FF',
  65. width: 6.5,
  66. lineType: PolylineType.color,
  67. points: points ?? [])
  68. ];
  69. bean.isRequestSuccess.value = true;
  70. bean.lastRequestTime = DateTime.now();
  71. }).whenComplete(() {
  72. bean.isRequesting = false;
  73. });
  74. }
  75. }
  76. class TodayTrackReportBean {
  77. final String userId;
  78. bool isRequesting = false;
  79. final RxBool isRequestSuccess = RxBool(false);
  80. TrackDailyBean? startPoint;
  81. TrackDailyBean? exceptionPoint;
  82. List<AtmobTrackPoint>? trackPoints;
  83. List<Polyline>? polylines;
  84. List<Marker>? markers;
  85. // 记录上一次请求成功的时间
  86. DateTime? lastRequestTime;
  87. TodayTrackReportBean(this.userId);
  88. MapPadding mapPadding =
  89. MapPadding(left: 10.w, right: 10.w, top: 10.w, bottom: 10.w);
  90. bool get isExpired {
  91. if (lastRequestTime == null) return true;
  92. return DateTime.now().difference(lastRequestTime!) >
  93. const Duration(minutes: 5);
  94. }
  95. }