Pārlūkot izejas kodu

[fix]修复会员状态变化时更新地图marker显示

zk 6 mēneši atpakaļ
vecāks
revīzija
ce55c9ac89

+ 8 - 0
lib/data/repositories/friends_repository.dart

@@ -11,6 +11,7 @@ import '../../socket/atmob_location_client.dart';
 import '../../utils/atmob_log.dart';
 import '../api/request/add_friend_request.dart';
 import '../api/request/friends_operation_request.dart';
+import '../api/response/electric_query_response.dart';
 import '../api/response/friends_list_response.dart';
 import '../bean/user_info.dart';
 
@@ -31,6 +32,7 @@ class FriendsRepository {
     AtmobLocationClient.addLocationListener((location) {
       updateFriendsLocation(location);
     });
+    refreshFriends();
   }
 
   void updateFriendsLocation(List<LocationInfo> location) {
@@ -134,4 +136,10 @@ class FriendsRepository {
         .getUserInfoFromId(FriendsOperationRequest(friendId: friendId))
         .then(HttpHandler.handle(true));
   }
+
+  Future<ElectricQueryResponse> userElectricQuery(String friendId) {
+    return atmobApi
+        .userElectricQuery(FriendsOperationRequest(friendId: friendId))
+        .then(HttpHandler.handle(true));
+  }
 }

+ 93 - 30
lib/module/main/main_controller.dart

@@ -1,7 +1,5 @@
 import 'dart:async';
-import 'dart:ffi';
 import 'dart:io';
-
 import 'package:flutter/services.dart';
 import 'package:flutter_map/flutter_map.dart';
 import 'package:flutter_tool_android/flutter_tool_android.dart';
@@ -26,7 +24,6 @@ import 'package:location/sdk/map/map_helper.dart';
 import 'package:location/utils/atmob_log.dart';
 import 'package:location/utils/mmkv_util.dart';
 import 'package:location/utils/toast_util.dart';
-
 import '../../data/bean/member_status_info.dart';
 import '../../data/repositories/config_repository.dart';
 import '../../data/repositories/track_repository.dart';
@@ -93,6 +90,10 @@ class MainController extends BaseController {
   String? lastCheckFriendId;
   bool isExecuteAutoSelect = false;
 
+  Timer? electricTimer;
+
+  final Map<String, int> electricMap = {};
+
   RxMap<String, TodayTrackReportBean> get todayTrackReportMap =>
       todayTrackHelper.todayTrackReportMap;
 
@@ -127,42 +128,66 @@ class MainController extends BaseController {
         _selectedFriend.value = mineUserInfo;
       }
     });
-    friendsListSubscription = _friendsList.listen((list) {
-      integrateList.clear();
-      integrateList.add(mineUserInfo);
-      integrateList.addAll(list);
-      mapController.replaceAllMarkers(
-          Location2MarkerUtil.userInfoList2MarkerList(integrateList,
-              accountRepository.memberIsExpired(), selectedFriend));
-      if (selectedFriend != null) {
-        UserInfo? userInfo = integrateList
-            .firstWhereOrNull((element) => element.id == selectedFriend?.id);
-        _selectedFriend.value = userInfo;
-      }
-      _autoSelectFriend();
-    });
+    //刷新好友列表
+    if (_friendsList.isNotEmpty) {
+      _updateFriendList(_friendsList);
+    }
+    friendsListSubscription =
+        _friendsList.listen((list) => _updateFriendList(list));
+
+    //刷新我的marker
     updateMineInfo(accountRepository.mineUserInfo.value);
     mineUserInfoSubscription =
         accountRepository.mineUserInfo.listen((mineInfo) {
       updateMineInfo(mineInfo);
     });
+    //刷新我的定位
+    final location = accountRepository.mineUserInfo.value.lastLocation.value;
+    if (location != null) {
+      _updateMineLocation(location);
+    }
     mineLocationSubscription =
         accountRepository.mineUserInfo.value.lastLocation.listen((location) {
-      final mineInfo = accountRepository.mineUserInfo.value;
-      mapController.updateOrAddMarker(Location2MarkerUtil.userInfo2Marker(
-          mineInfo, selectedFriend?.id == mineInfo.id));
-      if (isFirstShowMineLocation && location != null) {
-        isFirstShowMineLocation = false;
-        animateCameraToUser(mineInfo);
-      }
+      _updateMineLocation(location);
+    });
+    //根据会员状态刷新好友列表
+    memberStatusInfoSubscription =
+        accountRepository.memberStatusInfo.listen((memberStatus) {
+      _updateFriendList(_friendsList);
     });
-
-    friendsRepository.refreshFriends();
 
     ///刷新检查有没有广告
     _refreshTrackDailyDialogs();
   }
 
+  void _updateMineLocation(LocationInfo? location) {
+    final mineInfo = accountRepository.mineUserInfo.value;
+    mapController.updateOrAddMarker(Location2MarkerUtil.userInfo2Marker(
+        mineInfo, selectedFriend?.id == mineInfo.id, null));
+    if (isFirstShowMineLocation && location != null) {
+      isFirstShowMineLocation = false;
+      animateCameraToUser(mineInfo);
+    }
+  }
+
+  void _updateFriendList(List<UserInfo> list) {
+    integrateList.clear();
+    integrateList.add(mineUserInfo);
+    integrateList.addAll(list);
+    mapController.replaceAllMarkers(Location2MarkerUtil.userInfoList2MarkerList(
+        integrateList, accountRepository.memberIsExpired(), selectedFriend));
+    if (selectedFriend != null) {
+      UserInfo? userInfo = integrateList
+          .firstWhereOrNull((element) => element.id == selectedFriend?.id);
+      if (userInfo == null) {
+        _selectedFriend.value = null;
+      } else {
+        _setSelectUserInfo(userInfo);
+      }
+    }
+    _autoSelectFriend();
+  }
+
   ///刷新检查有没有广告
   void _refreshTrackDailyDialogs() {
     trackRepository.locationTrackDailyDialogs().then((trackResponse) {
@@ -190,7 +215,7 @@ class MainController extends BaseController {
       return;
     }
     mapController.updateOrAddMarker(Location2MarkerUtil.userInfo2Marker(
-        mineInfo, selectedFriend?.id == mineInfo.id));
+        mineInfo, selectedFriend?.id == mineInfo.id, null));
   }
 
   Future<void> onAddFriendClick() {
@@ -211,21 +236,58 @@ class MainController extends BaseController {
 
   void onSelectUserClick(UserInfo userInfo) {
     KVUtil.putString(Constants.keyLastSelectFriendId, userInfo.id);
+    if (_selectedFriend.value == userInfo) {
+      return;
+    }
     _setSelectUserInfo(userInfo);
   }
 
   void _setSelectUserInfo(UserInfo userInfo) {
     UserInfo? oldInfo = _selectedFriend.value;
     _selectedFriend.value = userInfo;
+    //定时查询手机电量
+    _scheduleQueryBattery();
     //修改地图选中
-    _updateMapSelected(oldInfo, userInfo);
+    int? electric = electricMap[userInfo.id];
+    _updateMapSelected(oldInfo, userInfo, electric: electric);
     if (!accountRepository.memberIsExpired() || userInfo.isMine == true) {
       //移动到选中的位置
       animateCameraToUser(userInfo);
     }
   }
 
-  void _updateMapSelected(UserInfo? oldInfo, UserInfo newInfo) {
+  void _scheduleQueryBattery() {
+    electricTimer?.cancel();
+    final friend = _selectedFriend.value;
+    if (friend == null || friend.id == Constants.mineLocationId) {
+      return;
+    }
+    queryFriendElectric(friend);
+    electricTimer = Timer.periodic(const Duration(minutes: 3), (timer) {
+      queryFriendElectric(friend);
+    });
+  }
+
+  void queryFriendElectric(UserInfo friend) async {
+    friendsRepository
+        .userElectricQuery(friend.id)
+        .then((response) => response.electric)
+        .then((electric) {
+      //更新选中点位的电量
+      if (electric == null) {
+        return;
+      }
+      electricMap[friend.id] = electric;
+      final selectFriend = _selectedFriend.value;
+      if (selectFriend == null || friend.id != selectFriend.id) {
+        return;
+      }
+      _updateMapSelected(null, selectFriend, electric: electric);
+    });
+  }
+
+  void _updateMapSelected(UserInfo? oldInfo, UserInfo newInfo,
+      {int? electric}) {
     List<UserInfo> markers = [];
     if (oldInfo != null) {
       markers.add(oldInfo);
@@ -233,7 +295,8 @@ class MainController extends BaseController {
     markers.add(newInfo);
     mapController.updateOrAddMarkers(
         Location2MarkerUtil.userInfoList2MarkerList(
-            markers, accountRepository.memberIsExpired(), selectedFriend));
+            markers, accountRepository.memberIsExpired(), selectedFriend,
+            electric: electric));
   }
 
   void animateCameraToUser(UserInfo userInfo) {

+ 11 - 6
lib/utils/location_convert_marker_util.dart

@@ -5,8 +5,8 @@ import 'package:location/data/consts/constants.dart';
 class Location2MarkerUtil {
   Location2MarkerUtil._();
 
-  static Marker userInfo2Marker(UserInfo e, bool isSelected) {
-    return Marker(
+  static Marker userInfo2Marker(UserInfo e, bool isSelected, int? electric) {
+    final marker = Marker(
       id: e.id,
       markerName: e.getUserNickName(),
       longitude: e.lastLocation.value?.longitude,
@@ -17,19 +17,24 @@ class Location2MarkerUtil {
       isSelected: isSelected,
       customAvatarUrl: e.avatar,
     );
+    if (electric != null) {
+      marker.tags = {'electric': electric};
+    }
+    return marker;
   }
 
-  static List<Marker> userInfoList2MarkerList(
-      List<UserInfo> list, bool isMemberExpired, UserInfo? selectedFriend) {
+  static List<Marker> userInfoList2MarkerList(List<UserInfo> list,
+      bool isMemberExpired, UserInfo? selectedFriend,
+      {int? electric}) {
     List<Marker> markers = [];
     for (var e in list) {
       if (e.isMine == true) {
-        markers.add(userInfo2Marker(e, e.id == selectedFriend?.id));
+        markers.add(userInfo2Marker(e, e.id == selectedFriend?.id, electric));
       } else if (e.blockedMe != true &&
           e.lastLocation.value?.longitude != null &&
           e.lastLocation.value?.latitude != null &&
           !isMemberExpired) {
-        markers.add(userInfo2Marker(e, e.id == selectedFriend?.id));
+        markers.add(userInfo2Marker(e, e.id == selectedFriend?.id, electric));
       }
     }
     return markers;

+ 3 - 0
plugins/map/lib/src/widget/map_widget.dart

@@ -63,6 +63,9 @@ class _MapWidgetState extends State<MapWidget> {
   }
 
   void showMarker() {
+    if (widget.markers == null || widget.markers!.isEmpty) {
+      return;
+    }
     final markerPoints = widget.markers
         ?.map((marker) =>
             LatLng(latitude: marker.latitude, longitude: marker.longitude))