expo-gaode-map 2.2.40-next.0 → 2.2.41-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -114,6 +114,8 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
114
114
  private var overlayContainer: UIView!
115
115
  /// 显式跟踪所有覆盖物视图(新架构下 subviews 可能不可靠)
116
116
  private var overlayViews: [UIView] = []
117
+ /// MarkerView 短暂 detach 时延迟注销,避免 annotation 暂时找不到自定义 view 而回退默认样式
118
+ private var pendingMarkerOverlayUnregisterTasks: [ObjectIdentifier: DispatchWorkItem] = [:]
117
119
 
118
120
  // MARK: - 事件节流控制
119
121
 
@@ -251,6 +253,8 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
251
253
  }
252
254
 
253
255
  private func registerOverlayView(_ view: UIView) {
256
+ cancelPendingMarkerOverlayUnregister(for: view)
257
+
254
258
  guard !overlayViews.contains(where: { $0 === view }) else {
255
259
  return
256
260
  }
@@ -258,9 +262,31 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
258
262
  }
259
263
 
260
264
  private func unregisterOverlayView(_ view: UIView) {
265
+ cancelPendingMarkerOverlayUnregister(for: view)
261
266
  overlayViews.removeAll { $0 === view }
262
267
  }
263
268
 
269
+ private func scheduleMarkerOverlayUnregister(_ markerView: MarkerView) {
270
+ cancelPendingMarkerOverlayUnregister(for: markerView)
271
+
272
+ let identifier = ObjectIdentifier(markerView)
273
+ let task = DispatchWorkItem { [weak self, weak markerView] in
274
+ guard let self = self, let markerView = markerView else { return }
275
+ self.pendingMarkerOverlayUnregisterTasks[identifier] = nil
276
+ guard markerView.superview == nil else { return }
277
+ self.unregisterOverlayView(markerView)
278
+ }
279
+
280
+ pendingMarkerOverlayUnregisterTasks[identifier] = task
281
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.35, execute: task)
282
+ }
283
+
284
+ private func cancelPendingMarkerOverlayUnregister(for view: UIView) {
285
+ let identifier = ObjectIdentifier(view)
286
+ pendingMarkerOverlayUnregisterTasks[identifier]?.cancel()
287
+ pendingMarkerOverlayUnregisterTasks[identifier] = nil
288
+ }
289
+
264
290
  private func prepareOverlayViewForHosting(_ view: UIView) {
265
291
  guard !(view is MarkerView) else {
266
292
  return
@@ -336,8 +362,8 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
336
362
  // 🔑 处理所有覆盖物 - 从跟踪数组中移除并确保 native 对象也从地图移除
337
363
  // 🔑 关键修复:先从数组移除,再调用 super,防止 super 触发的事件回调中引用已卸载的视图
338
364
  if let markerView = subview as? MarkerView {
339
- unregisterOverlayView(markerView)
340
- // MarkerView 内部的 willMove(toSuperview: nil) 会处理 annotation 的移除
365
+ scheduleMarkerOverlayUnregister(markerView)
366
+ // MarkerView 内部也会延迟确认 annotation 移除,避免 transient detach 闪烁。
341
367
  } else if let circleView = subview as? CircleView {
342
368
  unregisterOverlayView(circleView)
343
369
  if let mapView, let circle = circleView.circle {
@@ -898,6 +924,8 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
898
924
  appleMapView?.removeOverlays(appleMapView?.overlays ?? [])
899
925
 
900
926
  // 清空覆盖物数组
927
+ pendingMarkerOverlayUnregisterTasks.values.forEach { $0.cancel() }
928
+ pendingMarkerOverlayUnregisterTasks.removeAll()
901
929
  overlayViews.removeAll()
902
930
 
903
931
  // 移除所有子视图
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-gaode-map",
3
- "version": "2.2.40-next.0",
3
+ "version": "2.2.41-next.0",
4
4
  "description": "Expo Modules AMap (Gaode Map) stack for Expo/React Native: Config Plugin, New Architecture support, maps, location, search, offline maps, and react-native-amap3d migration guidance.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",