浏览代码

[new]优化登录登出地图标记刷新问题

zk 8 月之前
父节点
当前提交
23fb25e9a7

+ 22 - 9
lib/module/main/main_controller.dart

@@ -11,6 +11,7 @@ import 'package:location/data/repositories/account_repository.dart';
 import 'package:location/data/repositories/friends_repository.dart';
 import 'package:flutter_map/flutter_map.dart';
 import 'package:location/sdk/map/map_helper.dart';
+import 'package:location/utils/atmob_log.dart';
 import 'package:location/utils/base_expand.dart';
 import '../../dialog/add_friend_dialog.dart';
 import '../../dialog/check_loation_permission_dialog.dart';
@@ -38,27 +39,37 @@ class MainController extends BaseController {
   final MapController mapController = MapController();
 
   StreamSubscription? mineLocationSubscription;
+  StreamSubscription? friendsListSubscription;
+  StreamSubscription? loginSubscription;
 
   bool isFirstShowMineLocation = true;
 
   @override
   void onReady() {
     super.onReady();
-    friendsList.listen((list) {
-      mapController.updateOrAddMarkers(
-          Location2MarkerUtil.userInfoList2MarkerList(list, selectedFriend));
-    });
+
     AddFriendDialog.show(
         onAddClick: () async {
           await onAddFriendClick();
           checkLocationPermissionCallback();
         },
         onNotAddDismiss: checkLocationPermissionCallback);
+
+    loginSubscription = accountRepository.isLogin.listen((isLogin) {
+      if (isLogin == false) {
+        _selectedFriend.value = null;
+      }
+    });
+    friendsListSubscription = friendsList.listen((list) {
+      list.insert(0, mineUserInfo);
+      mapController.replaceAllMarkers(
+          Location2MarkerUtil.userInfoList2MarkerList(list, selectedFriend));
+    });
     mineLocationSubscription =
         accountRepository.mineUserInfo.value.lastLocation.listen((location) {
       final mineInfo = accountRepository.mineUserInfo.value;
       mapController.updateOrAddMarker(Location2MarkerUtil.userInfo2Marker(
-          mineInfo, selectedFriend == mineInfo));
+          mineInfo, selectedFriend?.id == mineInfo.id));
       if (isFirstShowMineLocation && location != null) {
         isFirstShowMineLocation = false;
         animateCameraToUser(mineInfo);
@@ -82,13 +93,13 @@ class MainController extends BaseController {
     }
   }
 
-  void onSelectClick(UserInfo mineLocation) {
+  void onSelectClick(UserInfo userInfo) {
     UserInfo? oldInfo = _selectedFriend.value;
-    _selectedFriend.value = mineLocation;
+    _selectedFriend.value = userInfo;
     //修改地图选中
-    _updateMapSelected(oldInfo, mineLocation);
+    _updateMapSelected(oldInfo, userInfo);
     //移动到选中的位置
-    animateCameraToUser(mineLocation);
+    animateCameraToUser(userInfo);
   }
 
   void _updateMapSelected(UserInfo? oldInfo, UserInfo newInfo) {
@@ -172,5 +183,7 @@ class MainController extends BaseController {
   @override
   void onClose() {
     mineLocationSubscription?.cancel();
+    friendsListSubscription?.cancel();
+    loginSubscription?.cancel();
   }
 }

+ 0 - 7
lib/module/main/main_page.dart

@@ -224,13 +224,6 @@ class MainPage extends BasePage<MainController> {
           padding: EdgeInsets.only(left: 12.w),
           scrollDirection: Axis.horizontal,
           children: [
-            Obx(() {
-              return mainFriendItem(controller.mineUserInfo,
-                  controller.selectedFriend?.id == controller.mineUserInfo.id,
-                  onTap: () {
-                controller.onSelectClick(controller.mineUserInfo);
-              });
-            }),
             for (UserInfo userInfo in controller.friendsList)
               Obx(() {
                 return mainFriendItem(

+ 3 - 1
lib/utils/location_convert_marker_util.dart

@@ -17,6 +17,8 @@ class Location2MarkerUtil {
 
   static List<Marker> userInfoList2MarkerList(
       List<UserInfo> list, UserInfo? selectedFriend) {
-    return list.map((e) => userInfo2Marker(e, e == selectedFriend)).toList();
+    return list
+        .map((e) => userInfo2Marker(e, e.id == selectedFriend?.id))
+        .toList();
   }
 }

+ 1 - 1
plugins/map/lib/src/consts/map_constants.dart

@@ -26,6 +26,6 @@ class MapConstants {
 
   //标记物相关方法名称
   static const String methodUpdateOrAddMarkers = "marker#updateOrAddMarkers";
-  static const String methodDeleteMarkers = "marker#deleteMarkers";
+  static const String methodReplaceAllMarkers = "marker#replaceAllMarkers";
   static const String methodMarkerOnTap = "marker#onTap";
 }

+ 3 - 0
plugins/map/lib/src/interface/map_overlays_interface.dart

@@ -12,4 +12,7 @@ abstract class MapOverlaysInterface {
   void updateOrAddMarkers(List<Marker> markers);
 
   void updateOrAddMarker(Marker marker);
+
+  //marker全地图替换,需对比之前缓存的,如果有则更新,没有则移除;当markers为空时,执行清空操作
+  void replaceAllMarkers(List<Marker> markers);
 }

+ 16 - 1
plugins/map/lib/src/widget/map_controller.dart

@@ -12,7 +12,6 @@ class MapController extends MapOverlaysInterface {
   MethodChannel? _channel;
   bool _isDisposed = false;
 
-
   void setChannel(MethodChannel channel) {
     if (_isDisposed) return;
 
@@ -87,4 +86,20 @@ class MapController extends MapOverlaysInterface {
   void updateOrAddMarker(Marker marker) {
     updateOrAddMarkers([marker]);
   }
+
+  @override
+  void replaceAllMarkers(List<Marker> markers) {
+    if (_isDisposed || markers.isEmpty) return;
+    final serialized = jsonEncode(markers);
+    final params = {
+      'method': MapConstants.methodReplaceAllMarkers,
+      'args': serialized
+    };
+    debugPrint("replaceAllMarkers...params==>$params");
+    if (_channel != null) {
+      _executeMethod(params);
+    } else {
+      _pendingOperations.add(params);
+    }
+  }
 }

+ 2 - 2
plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/contants/Constants.java

@@ -34,11 +34,11 @@ public class Constants {
      * markers
      */
     public static final String METHOD_UPDATE_OR_ADD_MARKERS = "marker#updateOrAddMarkers";
-    public static final String METHOD_DELETE_MARKERS = "marker#deleteMarkers";
+    public static final String METHOD_REPLACE_ALL_MARKERS = "marker#replaceAllMarkers";
     public static final String METHOD_MARKER_ON_TAP = "marker#onTap";
 
 
-    public static final String[] METHOD_ID_LIST_FOR_MARKER = {METHOD_UPDATE_OR_ADD_MARKERS, METHOD_DELETE_MARKERS, METHOD_MARKER_ON_TAP};
+    public static final String[] METHOD_ID_LIST_FOR_MARKER = {METHOD_UPDATE_OR_ADD_MARKERS, METHOD_REPLACE_ALL_MARKERS, METHOD_MARKER_ON_TAP};
 
 
 }

+ 49 - 8
plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/overlays/marker/MarkersController.java

@@ -11,7 +11,6 @@ import androidx.annotation.NonNull;
 import androidx.constraintlayout.widget.ConstraintLayout;
 
 import com.amap.api.maps.AMap;
-import com.amap.api.maps.CameraUpdateFactory;
 import com.amap.api.maps.model.BitmapDescriptor;
 import com.amap.api.maps.model.BitmapDescriptorFactory;
 import com.amap.api.maps.model.LatLng;
@@ -25,13 +24,10 @@ import com.atmob.map_amap_android.overlays.MyMethodCallHandler;
 import com.atmob.map_amap_android.util.GsonUtil;
 import com.atmob.map_amap_android.util.LogUtil;
 import com.google.gson.Gson;
-import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 
-import org.json.JSONException;
-import org.json.JSONObject;
-
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 
@@ -71,14 +67,59 @@ public class MarkersController implements MyMethodCallHandler, AMap.OnMarkerClic
             case Constants.METHOD_UPDATE_OR_ADD_MARKERS:
                 updateMarkers(call, result);
                 break;
-            case Constants.METHOD_DELETE_MARKERS:
-                deleteMarkers(call, result);
+            case Constants.METHOD_REPLACE_ALL_MARKERS:
+                replaceAllMarkers(call, result);
                 break;
         }
     }
 
-    private void deleteMarkers(MethodCall call, MethodChannel.Result result) {
+    private void replaceAllMarkers(MethodCall call, MethodChannel.Result result) {
+        LogUtil.i(TAG, "replaceAllMarkers===>" + call.arguments());
+        try {
+            String arguments = call.arguments();
+            List<MakerInfo> list = null;
+            if (!TextUtils.isEmpty(arguments)) {
+                list = gson.fromJson(arguments, new TypeToken<List<MakerInfo>>() {
+                });
+            }
+            if (list == null || list.isEmpty()) {
+                clearAllMarkers();
+            } else {
+                for (MakerInfo makerInfo : list) {
+                    updateMarker(makerInfo);
+                }
+                //删除多余的marker
+                Iterator<String> iterator = currentMarkers.keySet().iterator();
+                while (iterator.hasNext()) {
+                    String key = iterator.next();
+                    boolean isExist = false;
+                    for (MakerInfo makerInfo : list) {
+                        if (Objects.equals(key, makerInfo.getId())) {
+                            isExist = true;
+                            break;
+                        }
+                    }
+                    if (!isExist) {
+                        Marker marker = currentMarkers.get(key);
+                        if (marker != null) {
+                            marker.remove();
+                        }
+                        iterator.remove();
+                    }
+                }
+            }
+            result.success(null);
+        } catch (Exception e) {
+            result.error("-1", "deleteAllMarkers.error", e.getMessage());
+        }
+    }
 
+
+    private void clearAllMarkers() {
+        for (Marker marker : currentMarkers.values()) {
+            marker.remove();
+        }
+        currentMarkers.clear();
     }
 
     private void updateMarkers(MethodCall call, MethodChannel.Result result) {