expo-gaode-map 1.1.0 → 1.1.2
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.
- package/android/src/main/java/expo/modules/gaodemap/managers/UIManager.kt +224 -53
- package/android/src/main/java/expo/modules/gaodemap/overlays/MarkerView.kt +38 -1
- package/build/ExpoGaodeMapView.d.ts +6 -7
- package/build/ExpoGaodeMapView.d.ts.map +1 -1
- package/build/ExpoGaodeMapView.js +7 -12
- package/build/ExpoGaodeMapView.js.map +1 -1
- package/build/types/map-view.types.d.ts +22 -23
- package/build/types/map-view.types.d.ts.map +1 -1
- package/build/types/map-view.types.js.map +1 -1
- package/build/types/overlays.types.d.ts +13 -17
- package/build/types/overlays.types.d.ts.map +1 -1
- package/build/types/overlays.types.js.map +1 -1
- package/docs/API.en.md +10 -10
- package/docs/API.md +10 -10
- package/docs/EXAMPLES.en.md +8 -8
- package/docs/EXAMPLES.md +11 -11
- package/ios/overlays/MarkerView.swift +20 -0
- package/package.json +1 -1
- package/src/ExpoGaodeMapView.tsx +13 -17
- package/src/types/map-view.types.ts +16 -16
- package/src/types/overlays.types.ts +10 -10
|
@@ -2,6 +2,10 @@ package expo.modules.gaodemap.managers
|
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import android.graphics.BitmapFactory
|
|
5
|
+
import android.location.Location
|
|
6
|
+
import android.location.LocationListener
|
|
7
|
+
import android.location.LocationManager as AndroidLocationManager
|
|
8
|
+
import android.os.Bundle
|
|
5
9
|
import com.amap.api.maps.AMap
|
|
6
10
|
import com.amap.api.maps.LocationSource
|
|
7
11
|
import com.amap.api.maps.model.BitmapDescriptorFactory
|
|
@@ -14,10 +18,13 @@ import java.net.URL
|
|
|
14
18
|
* UI 和手势管理器
|
|
15
19
|
* 负责地图控件显示、手势控制、图层显示等
|
|
16
20
|
*/
|
|
17
|
-
class UIManager(private val aMap: AMap, private val context: Context) {
|
|
21
|
+
class UIManager(private val aMap: AMap, private val context: Context) : LocationListener {
|
|
18
22
|
|
|
19
23
|
var onLocationChanged: ((latitude: Double, longitude: Double, accuracy: Float) -> Unit)? = null
|
|
20
24
|
|
|
25
|
+
private var locationManager: AndroidLocationManager? = null
|
|
26
|
+
private var locationChangedListener: LocationSource.OnLocationChangedListener? = null
|
|
27
|
+
|
|
21
28
|
// ==================== 控件显示 ====================
|
|
22
29
|
|
|
23
30
|
/**
|
|
@@ -79,27 +86,37 @@ class UIManager(private val aMap: AMap, private val context: Context) {
|
|
|
79
86
|
* 设置是否显示用户位置
|
|
80
87
|
*/
|
|
81
88
|
fun setShowsUserLocation(show: Boolean, followUserLocation: Boolean = false) {
|
|
89
|
+
android.util.Log.d("UIManager", "🔵 setShowsUserLocation: show=$show, follow=$followUserLocation")
|
|
90
|
+
|
|
82
91
|
if (show) {
|
|
92
|
+
// 创建默认的定位样式
|
|
83
93
|
if (currentLocationStyle == null) {
|
|
84
|
-
currentLocationStyle = MyLocationStyle()
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
94
|
+
currentLocationStyle = MyLocationStyle().apply {
|
|
95
|
+
// 根据是否跟随设置定位类型
|
|
96
|
+
val locationType = if (followUserLocation) {
|
|
97
|
+
MyLocationStyle.LOCATION_TYPE_FOLLOW // 连续定位并跟随
|
|
98
|
+
} else {
|
|
99
|
+
MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE // 连续定位,点会旋转
|
|
100
|
+
}
|
|
101
|
+
myLocationType(locationType)
|
|
102
|
+
interval(2000) // 2秒定位一次
|
|
103
|
+
showMyLocation(true)
|
|
104
|
+
}
|
|
105
|
+
android.util.Log.d("UIManager", "✨ 创建默认 MyLocationStyle")
|
|
88
106
|
} else {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
107
|
+
// 更新定位类型
|
|
108
|
+
val locationType = if (followUserLocation) {
|
|
109
|
+
MyLocationStyle.LOCATION_TYPE_FOLLOW
|
|
110
|
+
} else {
|
|
111
|
+
MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE
|
|
112
|
+
}
|
|
113
|
+
currentLocationStyle?.apply {
|
|
114
|
+
myLocationType(locationType)
|
|
115
|
+
interval(2000)
|
|
98
116
|
}
|
|
99
|
-
|
|
100
|
-
})
|
|
117
|
+
}
|
|
101
118
|
|
|
102
|
-
//
|
|
119
|
+
// 监听定位变化(用于通知 React Native)
|
|
103
120
|
aMap.setOnMyLocationChangeListener { location ->
|
|
104
121
|
onLocationChanged?.invoke(
|
|
105
122
|
location.latitude,
|
|
@@ -108,112 +125,266 @@ class UIManager(private val aMap: AMap, private val context: Context) {
|
|
|
108
125
|
)
|
|
109
126
|
}
|
|
110
127
|
|
|
128
|
+
// 应用定位样式
|
|
129
|
+
aMap.myLocationStyle = currentLocationStyle
|
|
130
|
+
|
|
131
|
+
// 启用定位(使用高德地图自己的定位)
|
|
111
132
|
aMap.isMyLocationEnabled = true
|
|
133
|
+
android.util.Log.d("UIManager", "✅ 定位已启用")
|
|
134
|
+
|
|
112
135
|
} else {
|
|
113
136
|
aMap.setOnMyLocationChangeListener(null)
|
|
114
137
|
aMap.isMyLocationEnabled = false
|
|
138
|
+
android.util.Log.d("UIManager", "❌ 定位已禁用")
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 启动真实的系统定位
|
|
144
|
+
*/
|
|
145
|
+
private fun startRealLocation() {
|
|
146
|
+
try {
|
|
147
|
+
if (locationManager == null) {
|
|
148
|
+
locationManager = context.getSystemService(Context.LOCATION_SERVICE) as AndroidLocationManager
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
val providers = locationManager?.getProviders(true) ?: emptyList()
|
|
152
|
+
android.util.Log.d("UIManager", "📡 可用的定位提供者: $providers")
|
|
153
|
+
|
|
154
|
+
// 优先使用 GPS,其次是网络定位
|
|
155
|
+
val provider = when {
|
|
156
|
+
providers.contains(AndroidLocationManager.GPS_PROVIDER) -> {
|
|
157
|
+
android.util.Log.d("UIManager", "✅ 使用 GPS 定位")
|
|
158
|
+
AndroidLocationManager.GPS_PROVIDER
|
|
159
|
+
}
|
|
160
|
+
providers.contains(AndroidLocationManager.NETWORK_PROVIDER) -> {
|
|
161
|
+
android.util.Log.d("UIManager", "✅ 使用网络定位")
|
|
162
|
+
AndroidLocationManager.NETWORK_PROVIDER
|
|
163
|
+
}
|
|
164
|
+
else -> {
|
|
165
|
+
android.util.Log.e("UIManager", "❌ 没有可用的定位提供者")
|
|
166
|
+
return
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 请求位置更新
|
|
171
|
+
locationManager?.requestLocationUpdates(
|
|
172
|
+
provider,
|
|
173
|
+
2000L, // 最小时间间隔 2秒
|
|
174
|
+
10f, // 最小距离变化 10米
|
|
175
|
+
this
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
// 立即获取最后已知位置
|
|
179
|
+
val lastLocation = locationManager?.getLastKnownLocation(provider)
|
|
180
|
+
if (lastLocation != null) {
|
|
181
|
+
android.util.Log.d("UIManager", "📍 获取到最后已知位置: ${lastLocation.latitude}, ${lastLocation.longitude}")
|
|
182
|
+
onLocationChanged(lastLocation)
|
|
183
|
+
} else {
|
|
184
|
+
android.util.Log.d("UIManager", "⏳ 等待首次定位...")
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
} catch (e: SecurityException) {
|
|
188
|
+
android.util.Log.e("UIManager", "❌ 定位权限未授予: ${e.message}")
|
|
189
|
+
} catch (e: Exception) {
|
|
190
|
+
android.util.Log.e("UIManager", "❌ 启动定位失败: ${e.message}", e)
|
|
115
191
|
}
|
|
116
192
|
}
|
|
117
193
|
|
|
194
|
+
/**
|
|
195
|
+
* 停止系统定位
|
|
196
|
+
*/
|
|
197
|
+
private fun stopRealLocation() {
|
|
198
|
+
try {
|
|
199
|
+
locationManager?.removeUpdates(this)
|
|
200
|
+
android.util.Log.d("UIManager", "🛑 已停止系统定位")
|
|
201
|
+
} catch (e: Exception) {
|
|
202
|
+
android.util.Log.e("UIManager", "停止定位失败: ${e.message}")
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* 位置变化回调
|
|
208
|
+
*/
|
|
209
|
+
override fun onLocationChanged(location: Location) {
|
|
210
|
+
android.util.Log.d("UIManager", "📍📍📍 系统定位回调: lat=${location.latitude}, lng=${location.longitude}, accuracy=${location.accuracy}m")
|
|
211
|
+
|
|
212
|
+
// 通知高德地图
|
|
213
|
+
locationChangedListener?.onLocationChanged(location)
|
|
214
|
+
|
|
215
|
+
// 通知 React Native
|
|
216
|
+
onLocationChanged?.invoke(
|
|
217
|
+
location.latitude,
|
|
218
|
+
location.longitude,
|
|
219
|
+
location.accuracy
|
|
220
|
+
)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
|
|
224
|
+
android.util.Log.d("UIManager", "定位状态变化: provider=$provider, status=$status")
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
override fun onProviderEnabled(provider: String) {
|
|
228
|
+
android.util.Log.d("UIManager", "✅ 定位提供者已启用: $provider")
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
override fun onProviderDisabled(provider: String) {
|
|
232
|
+
android.util.Log.d("UIManager", "❌ 定位提供者已禁用: $provider")
|
|
233
|
+
}
|
|
234
|
+
|
|
118
235
|
/**
|
|
119
236
|
* 设置用户位置样式
|
|
120
237
|
* 统一 iOS 和 Android 的 API
|
|
121
238
|
*/
|
|
122
239
|
fun setUserLocationRepresentation(config: Map<String, Any>) {
|
|
240
|
+
android.util.Log.d("UIManager", "🎨 setUserLocationRepresentation 被调用,配置: $config")
|
|
241
|
+
|
|
123
242
|
if (currentLocationStyle == null) {
|
|
124
|
-
currentLocationStyle = MyLocationStyle()
|
|
243
|
+
currentLocationStyle = MyLocationStyle().apply {
|
|
244
|
+
myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE)
|
|
245
|
+
interval(2000)
|
|
246
|
+
showMyLocation(true)
|
|
247
|
+
}
|
|
248
|
+
android.util.Log.d("UIManager", "创建新的 MyLocationStyle")
|
|
125
249
|
}
|
|
126
250
|
|
|
127
251
|
val style = currentLocationStyle!!
|
|
128
252
|
|
|
129
|
-
//
|
|
130
|
-
config["
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
253
|
+
// 是否显示精度圈 (showsAccuracyRing) - 先处理这个,设置默认值
|
|
254
|
+
val showsAccuracyRing = config["showsAccuracyRing"] as? Boolean ?: true
|
|
255
|
+
if (!showsAccuracyRing) {
|
|
256
|
+
// 不显示精度圈 - 设置透明色
|
|
257
|
+
style.radiusFillColor(android.graphics.Color.TRANSPARENT)
|
|
258
|
+
style.strokeColor(android.graphics.Color.TRANSPARENT)
|
|
259
|
+
style.strokeWidth(0f)
|
|
260
|
+
} else {
|
|
261
|
+
// 显示精度圈 - 使用自定义颜色或默认值
|
|
262
|
+
|
|
263
|
+
// 精度圈填充颜色 (fillColor)
|
|
264
|
+
config["fillColor"]?.let {
|
|
265
|
+
style.radiusFillColor(ColorParser.parseColor(it))
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// 精度圈边线颜色 (strokeColor)
|
|
269
|
+
config["strokeColor"]?.let {
|
|
270
|
+
style.strokeColor(ColorParser.parseColor(it))
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// 精度圈边线宽度 (lineWidth)
|
|
274
|
+
(config["lineWidth"] as? Number)?.let {
|
|
275
|
+
style.strokeWidth(it.toFloat())
|
|
150
276
|
}
|
|
151
277
|
}
|
|
152
278
|
|
|
153
279
|
// 自定义图标 (image)
|
|
154
|
-
|
|
280
|
+
val imagePath = config["image"] as? String
|
|
281
|
+
if (imagePath != null && imagePath.isNotEmpty()) {
|
|
282
|
+
android.util.Log.d("UIManager", "开始加载自定义定位图标: $imagePath")
|
|
155
283
|
|
|
156
284
|
// 将 dp 转换为 px (与 iOS points 对应)
|
|
157
285
|
val density = context.resources.displayMetrics.density
|
|
158
286
|
val imageWidth = (config["imageWidth"] as? Number)?.let { (it.toFloat() * density).toInt() }
|
|
159
287
|
val imageHeight = (config["imageHeight"] as? Number)?.let { (it.toFloat() * density).toInt() }
|
|
160
288
|
|
|
289
|
+
android.util.Log.d("UIManager", "图标尺寸: width=$imageWidth, height=$imageHeight, density=$density")
|
|
290
|
+
|
|
161
291
|
// 网络图片需要在后台线程加载
|
|
162
292
|
if (imagePath.startsWith("http://") || imagePath.startsWith("https://")) {
|
|
163
293
|
Thread {
|
|
164
294
|
try {
|
|
165
295
|
val originalBitmap = BitmapFactory.decodeStream(URL(imagePath).openStream())
|
|
166
296
|
android.os.Handler(android.os.Looper.getMainLooper()).post {
|
|
167
|
-
originalBitmap
|
|
297
|
+
if (originalBitmap != null) {
|
|
168
298
|
val scaledBitmap = if (imageWidth != null && imageHeight != null) {
|
|
169
|
-
android.graphics.Bitmap.createScaledBitmap(
|
|
170
|
-
} else
|
|
299
|
+
android.graphics.Bitmap.createScaledBitmap(originalBitmap, imageWidth, imageHeight, true)
|
|
300
|
+
} else originalBitmap
|
|
171
301
|
|
|
302
|
+
android.util.Log.d("UIManager", "✅ 网络图片加载成功 (${scaledBitmap.width}x${scaledBitmap.height}),应用到定位样式")
|
|
172
303
|
style.myLocationIcon(BitmapDescriptorFactory.fromBitmap(scaledBitmap))
|
|
304
|
+
|
|
305
|
+
// 重新应用样式并确保定位开启
|
|
173
306
|
aMap.myLocationStyle = style
|
|
174
|
-
|
|
307
|
+
|
|
308
|
+
// 如果定位没开,重新开启
|
|
309
|
+
if (!aMap.isMyLocationEnabled) {
|
|
310
|
+
android.util.Log.d("UIManager", "⚠️ 定位未启用,重新启用")
|
|
311
|
+
aMap.isMyLocationEnabled = true
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
android.util.Log.d("UIManager", "✅ 定位样式重新应用完成,定位状态: ${aMap.isMyLocationEnabled}")
|
|
315
|
+
} else {
|
|
316
|
+
android.util.Log.e("UIManager", "❌ 网络图片加载失败: bitmap is null")
|
|
317
|
+
}
|
|
175
318
|
}
|
|
176
319
|
} catch (e: Exception) {
|
|
177
|
-
android.util.Log.e("UIManager", "
|
|
320
|
+
android.util.Log.e("UIManager", "❌ 加载网络图片异常: ${e.message}", e)
|
|
178
321
|
}
|
|
179
322
|
}.start()
|
|
323
|
+
return // 异步加载,提前返回
|
|
180
324
|
} else {
|
|
181
|
-
//
|
|
325
|
+
// 本地图片在后台线程加载
|
|
182
326
|
Thread {
|
|
183
327
|
try {
|
|
184
328
|
val originalBitmap = when {
|
|
185
329
|
imagePath.startsWith("file://") -> {
|
|
330
|
+
android.util.Log.d("UIManager", "加载文件路径图片: ${imagePath.substring(7)}")
|
|
186
331
|
BitmapFactory.decodeFile(imagePath.substring(7))
|
|
187
332
|
}
|
|
188
333
|
else -> {
|
|
334
|
+
// 尝试从资源加载
|
|
335
|
+
val fileName = imagePath.substringBeforeLast('.')
|
|
336
|
+
android.util.Log.d("UIManager", "尝试从资源加载: $fileName")
|
|
189
337
|
val resId = context.resources.getIdentifier(
|
|
190
|
-
|
|
338
|
+
fileName,
|
|
191
339
|
"drawable",
|
|
192
340
|
context.packageName
|
|
193
341
|
)
|
|
342
|
+
android.util.Log.d("UIManager", "资源 ID: $resId")
|
|
194
343
|
if (resId != 0) {
|
|
195
344
|
BitmapFactory.decodeResource(context.resources, resId)
|
|
196
|
-
} else
|
|
345
|
+
} else {
|
|
346
|
+
// 尝试直接作为文件路径
|
|
347
|
+
android.util.Log.d("UIManager", "尝试作为文件路径加载: $imagePath")
|
|
348
|
+
BitmapFactory.decodeFile(imagePath)
|
|
349
|
+
}
|
|
197
350
|
}
|
|
198
351
|
}
|
|
199
352
|
|
|
200
353
|
android.os.Handler(android.os.Looper.getMainLooper()).post {
|
|
201
|
-
originalBitmap
|
|
354
|
+
if (originalBitmap != null) {
|
|
202
355
|
val scaledBitmap = if (imageWidth != null && imageHeight != null) {
|
|
203
|
-
android.graphics.Bitmap.createScaledBitmap(
|
|
204
|
-
} else
|
|
356
|
+
android.graphics.Bitmap.createScaledBitmap(originalBitmap, imageWidth, imageHeight, true)
|
|
357
|
+
} else originalBitmap
|
|
205
358
|
|
|
359
|
+
android.util.Log.d("UIManager", "✅ 本地图片加载成功 (${scaledBitmap.width}x${scaledBitmap.height}),应用到定位样式")
|
|
206
360
|
style.myLocationIcon(BitmapDescriptorFactory.fromBitmap(scaledBitmap))
|
|
361
|
+
|
|
362
|
+
// 重新应用样式并确保定位开启
|
|
207
363
|
aMap.myLocationStyle = style
|
|
208
|
-
|
|
364
|
+
|
|
365
|
+
// 如果定位没开,重新开启
|
|
366
|
+
if (!aMap.isMyLocationEnabled) {
|
|
367
|
+
android.util.Log.d("UIManager", "⚠️ 定位未启用,重新启用")
|
|
368
|
+
aMap.isMyLocationEnabled = true
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
android.util.Log.d("UIManager", "✅ 定位样式重新应用完成,定位状态: ${aMap.isMyLocationEnabled}")
|
|
372
|
+
} else {
|
|
373
|
+
android.util.Log.e("UIManager", "❌ 本地图片加载失败: bitmap is null, path=$imagePath")
|
|
374
|
+
}
|
|
209
375
|
}
|
|
210
376
|
} catch (e: Exception) {
|
|
211
|
-
android.util.Log.e("UIManager", "
|
|
377
|
+
android.util.Log.e("UIManager", "❌ 加载本地图片异常: ${e.message}", e)
|
|
212
378
|
}
|
|
213
379
|
}.start()
|
|
380
|
+
return // 异步加载,提前返回
|
|
214
381
|
}
|
|
382
|
+
} else {
|
|
383
|
+
// 没有自定义图标,使用默认蓝点
|
|
384
|
+
android.util.Log.d("UIManager", "使用默认定位图标(蓝点)")
|
|
215
385
|
}
|
|
216
386
|
|
|
387
|
+
// 立即应用样式(针对没有自定义图标的情况)
|
|
217
388
|
aMap.myLocationStyle = style
|
|
218
389
|
}
|
|
219
390
|
|
|
@@ -545,8 +545,45 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
|
|
|
545
545
|
}
|
|
546
546
|
|
|
547
547
|
|
|
548
|
+
override fun removeView(child: View?) {
|
|
549
|
+
android.util.Log.d("MarkerView", "➖ removeView 被调用,child = $child, childCount = $childCount")
|
|
550
|
+
super.removeView(child)
|
|
551
|
+
|
|
552
|
+
// 子视图被移除后,清除图标或恢复默认图标
|
|
553
|
+
mainHandler.postDelayed({
|
|
554
|
+
android.util.Log.d("MarkerView", "⏰ removeView 延迟更新,childCount = $childCount")
|
|
555
|
+
if (childCount == 0 && marker != null) {
|
|
556
|
+
android.util.Log.d("MarkerView", "📍 所有子视图已移除,恢复默认图标")
|
|
557
|
+
marker?.setIcon(BitmapDescriptorFactory.defaultMarker())
|
|
558
|
+
marker?.setAnchor(0.5f, 1.0f)
|
|
559
|
+
}
|
|
560
|
+
}, 50)
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
override fun removeViewAt(index: Int) {
|
|
564
|
+
android.util.Log.d("MarkerView", "➖ removeViewAt 被调用,index = $index, childCount = $childCount")
|
|
565
|
+
if (index >= 0 && index < childCount) {
|
|
566
|
+
super.removeViewAt(index)
|
|
567
|
+
|
|
568
|
+
// 子视图被移除后,清除图标或恢复默认图标
|
|
569
|
+
mainHandler.postDelayed({
|
|
570
|
+
android.util.Log.d("MarkerView", "⏰ removeViewAt 延迟更新,childCount = $childCount")
|
|
571
|
+
if (childCount == 0 && marker != null) {
|
|
572
|
+
android.util.Log.d("MarkerView", "📍 所有子视图已移除,恢复默认图标")
|
|
573
|
+
marker?.setIcon(BitmapDescriptorFactory.defaultMarker())
|
|
574
|
+
marker?.setAnchor(0.5f, 1.0f)
|
|
575
|
+
} else if (childCount > 0 && marker != null) {
|
|
576
|
+
android.util.Log.d("MarkerView", "🔄 还有子视图,更新图标")
|
|
577
|
+
updateMarkerIcon()
|
|
578
|
+
}
|
|
579
|
+
}, 50)
|
|
580
|
+
} else {
|
|
581
|
+
android.util.Log.w("MarkerView", "⚠️ removeViewAt: 无效的索引 $index,childCount = $childCount")
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
548
585
|
override fun addView(child: View?, index: Int, params: android.view.ViewGroup.LayoutParams?) {
|
|
549
|
-
android.util.Log.d("MarkerView", "➕ addView 被调用,child = $child")
|
|
586
|
+
android.util.Log.d("MarkerView", "➕ addView 被调用,child = $child, index = $index, childCount = $childCount")
|
|
550
587
|
super.addView(child, index, params)
|
|
551
588
|
|
|
552
589
|
// 延迟更新图标,等待 React Native 样式和内容渲染
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { NativeSyntheticEvent } from 'react-native';
|
|
2
3
|
import { EventManager } from './utils/EventManager';
|
|
3
4
|
import type { MapViewProps, MapViewRef, LatLng } from './types';
|
|
4
5
|
export type { MapViewRef } from './types';
|
|
5
6
|
export declare const MapContext: React.Context<React.RefObject<MapViewRef | null> | null>;
|
|
6
7
|
type MarkerEventCallbacks = {
|
|
7
|
-
onPress?: () => void;
|
|
8
|
-
onDragStart?: () => void;
|
|
9
|
-
onDrag?: () => void;
|
|
10
|
-
onDragEnd?: (event:
|
|
11
|
-
nativeEvent: LatLng;
|
|
12
|
-
}) => void;
|
|
8
|
+
onPress?: (event: NativeSyntheticEvent<{}>) => void;
|
|
9
|
+
onDragStart?: (event: NativeSyntheticEvent<LatLng>) => void;
|
|
10
|
+
onDrag?: (event: NativeSyntheticEvent<LatLng>) => void;
|
|
11
|
+
onDragEnd?: (event: NativeSyntheticEvent<LatLng>) => void;
|
|
13
12
|
};
|
|
14
13
|
type OverlayEventCallbacks = {
|
|
15
|
-
onPress?: () => void;
|
|
14
|
+
onPress?: (event: NativeSyntheticEvent<{}>) => void;
|
|
16
15
|
};
|
|
17
16
|
export declare const MarkerEventContext: React.Context<EventManager<MarkerEventCallbacks> | null>;
|
|
18
17
|
export declare const CircleEventContext: React.Context<EventManager<OverlayEventCallbacks> | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapView.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAGV,MAAM,EAMP,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,eAAO,MAAM,UAAU,0DAAuE,CAAC;AAE/F,KAAK,oBAAoB,GAAG;IAC1B,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapView.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAGV,MAAM,EAMP,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,eAAO,MAAM,UAAU,0DAAuE,CAAC;AAE/F,KAAK,oBAAoB,GAAG;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC5D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACvD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CAC3D,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF,eAAO,MAAM,kBAAkB,0DAAuE,CAAC;AACvG,eAAO,MAAM,kBAAkB,2DAAwE,CAAC;AACxG,eAAO,MAAM,mBAAmB,2DAAwE,CAAC;AACzG,eAAO,MAAM,oBAAoB,2DAAwE,CAAC;AAE1G;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,gBAAgB,iFAiRpB,CAAC;AAIH,eAAe,gBAAgB,CAAC"}
|
|
@@ -35,49 +35,44 @@ const ExpoGaodeMapView = React.forwardRef((props, ref) => {
|
|
|
35
35
|
const handleMarkerPress = (event) => {
|
|
36
36
|
const markerId = event.nativeEvent?.markerId;
|
|
37
37
|
if (markerId)
|
|
38
|
-
markerEventManager.trigger(markerId, 'onPress');
|
|
38
|
+
markerEventManager.trigger(markerId, 'onPress', event);
|
|
39
39
|
props.onMarkerPress?.(event);
|
|
40
40
|
};
|
|
41
41
|
const handleMarkerDragStart = (event) => {
|
|
42
42
|
const markerId = event.nativeEvent?.markerId;
|
|
43
43
|
if (markerId)
|
|
44
|
-
markerEventManager.trigger(markerId, 'onDragStart');
|
|
44
|
+
markerEventManager.trigger(markerId, 'onDragStart', event);
|
|
45
45
|
props.onMarkerDragStart?.(event);
|
|
46
46
|
};
|
|
47
47
|
const handleMarkerDrag = (event) => {
|
|
48
48
|
const markerId = event.nativeEvent?.markerId;
|
|
49
49
|
if (markerId)
|
|
50
|
-
markerEventManager.trigger(markerId, 'onDrag');
|
|
50
|
+
markerEventManager.trigger(markerId, 'onDrag', event);
|
|
51
51
|
props.onMarkerDrag?.(event);
|
|
52
52
|
};
|
|
53
53
|
const handleMarkerDragEnd = (event) => {
|
|
54
54
|
const markerId = event.nativeEvent?.markerId;
|
|
55
55
|
if (markerId) {
|
|
56
|
-
markerEventManager.trigger(markerId, 'onDragEnd',
|
|
57
|
-
nativeEvent: {
|
|
58
|
-
latitude: event.nativeEvent.latitude,
|
|
59
|
-
longitude: event.nativeEvent.longitude
|
|
60
|
-
}
|
|
61
|
-
});
|
|
56
|
+
markerEventManager.trigger(markerId, 'onDragEnd', event);
|
|
62
57
|
}
|
|
63
58
|
props.onMarkerDragEnd?.(event);
|
|
64
59
|
};
|
|
65
60
|
const handleCirclePress = (event) => {
|
|
66
61
|
const circleId = event.nativeEvent?.circleId;
|
|
67
62
|
if (circleId)
|
|
68
|
-
circleEventManager.trigger(circleId, 'onPress');
|
|
63
|
+
circleEventManager.trigger(circleId, 'onPress', event);
|
|
69
64
|
props.onCirclePress?.(event);
|
|
70
65
|
};
|
|
71
66
|
const handlePolygonPress = (event) => {
|
|
72
67
|
const polygonId = event.nativeEvent?.polygonId;
|
|
73
68
|
if (polygonId)
|
|
74
|
-
polygonEventManager.trigger(polygonId, 'onPress');
|
|
69
|
+
polygonEventManager.trigger(polygonId, 'onPress', event);
|
|
75
70
|
props.onPolygonPress?.(event);
|
|
76
71
|
};
|
|
77
72
|
const handlePolylinePress = (event) => {
|
|
78
73
|
const polylineId = event.nativeEvent?.polylineId;
|
|
79
74
|
if (polylineId)
|
|
80
|
-
polylineEventManager.trigger(polylineId, 'onPress');
|
|
75
|
+
polylineEventManager.trigger(polylineId, 'onPress', event);
|
|
81
76
|
props.onPolylinePress?.(event);
|
|
82
77
|
};
|
|
83
78
|
const apiRef = React.useMemo(() => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapView.js","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAgBpD,MAAM,UAAU,GAA8E,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;AAE3I,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAA4C,IAAI,CAAC,CAAC;AAa/F,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,aAAa,CAA4C,IAAI,CAAC,CAAC;AACvG,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,aAAa,CAA6C,IAAI,CAAC,CAAC;AACxG,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC,aAAa,CAA6C,IAAI,CAAC,CAAC;AACzG,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAA6C,IAAI,CAAC,CAAC;AAE1G;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAA2B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACjF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAmB,IAAI,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAoB,IAAI,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAwB,EAAE,EAAE,CAAC,CAAC;IAC7F,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAyB,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAyB,EAAE,EAAE,CAAC,CAAC;IAC/F,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAyB,EAAE,EAAE,CAAC,CAAC;IAChG,MAAM,iBAAiB,GAAG,CAAC,KAAU,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7C,IAAI,QAAQ;YAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9D,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,KAAU,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7C,IAAI,QAAQ;YAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAClE,KAAK,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,KAAU,EAAE,EAAE;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7C,IAAI,QAAQ;YAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7D,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,KAAU,EAAE,EAAE;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE;gBAChD,WAAW,EAAE;oBACX,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ;oBACpC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS;iBACvC;aACF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAAU,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7C,IAAI,QAAQ;YAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9D,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,KAAU,EAAE,EAAE;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC;QAC/C,IAAI,SAAS;YAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjE,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,KAAU,EAAE,EAAE;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC;QACjD,IAAI,UAAU;YAAE,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACpE,KAAK,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,MAAM,GAAe,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9C;;;;;;WAMG;QACH,UAAU,EAAE,KAAK,EAAE,QAAwB,EAAE,WAAmB,GAAG,EAAE,EAAE;YACrE,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD;;;;;WAKG;QACH,SAAS,EAAE,KAAK,EAAE,KAAY,EAAE,EAAE;YAChC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD;;;;;WAKG;QACH,SAAS,EAAE,KAAK,EAAE,MAAc,EAAE,WAAoB,KAAK,EAAE,EAAE;YAC7D,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD;;;;;WAKG;QACH,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,WAAoB,KAAK,EAAE,EAAE;YACzD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD;;;;WAIG;QACH,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC/C,CAAC;QACD;;;;;;WAMG;QACH,SAAS,EAAE,KAAK,EAAE,EAAU,EAAE,KAAkB,EAAE,EAAE;YAClD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD;;;;;WAKG;QACH,YAAY,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD;;;;;;WAMG;QACH,YAAY,EAAE,KAAK,EAAE,EAAU,EAAE,KAA2B,EAAE,EAAE;YAC9D,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD;;;;;;WAMG;QACH,SAAS,EAAE,KAAK,EAAE,EAAU,EAAE,KAAkB,EAAE,EAAE;YAClD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD;;;;;WAKG;QACH,YAAY,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD;;;;;;WAMG;QACH,YAAY,EAAE,KAAK,EAAE,EAAU,EAAE,KAA2B,EAAE,EAAE;YAC9D,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD;;;;;;WAMG;QACH,WAAW,EAAE,KAAK,EAAE,EAAU,EAAE,KAAoB,EAAE,EAAE;YACtD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD;;;;;WAKG;QACH,cAAc,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD;;;;;;;WAOG;QACH,cAAc,EAAE,KAAK,EAAE,EAAU,EAAE,KAA6B,EAAE,EAAE;YAClE,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD;;;;;;WAMG;QACH,UAAU,EAAE,KAAK,EAAE,EAAU,EAAE,KAAmB,EAAE,EAAE;YACpD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QACD;;;;;WAKG;QACH,aAAa,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;YAClC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD;;;;;;;WAOG;QACH,aAAa,EAAE,KAAK,EAAE,EAAU,EAAE,KAA4B,EAAE,EAAE;YAChE,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;KACF,CAAC,EAAE,EAAE,CAAC,CAAC;IAER;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC;IAC/B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD,OAAO,CACL,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CACtC;MAAA,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CACrD;QAAA,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CACrD;UAAA,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CACvD;YAAA,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CACzD;cAAA,CAAC,UAAU,CACT,GAAG,CAAC,CAAC,SAAS,CAAC,CACf,IAAI,KAAK,CAAC,CACV,aAAa,CAAC,CAAC,iBAAiB,CAAC,CACjC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CACzC,YAAY,CAAC,CAAC,gBAAgB,CAAC,CAC/B,eAAe,CAAC,CAAC,mBAAmB,CAAC,CACrC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CACjC,cAAc,CAAC,CAAC,kBAAkB,CAAC,CACnC,eAAe,CAAC,CAAC,mBAAmB,CAAC,CAErC;gBAAA,CAAC,KAAK,CAAC,QAAQ,CACjB;cAAA,EAAE,UAAU,CACd;YAAA,EAAE,oBAAoB,CAAC,QAAQ,CACjC;UAAA,EAAE,mBAAmB,CAAC,QAAQ,CAChC;QAAA,EAAE,kBAAkB,CAAC,QAAQ,CAC/B;MAAA,EAAE,kBAAkB,CAAC,QAAQ,CAC/B;IAAA,EAAE,UAAU,CAAC,QAAQ,CAAC,CACvB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAElD,eAAe,gBAAgB,CAAC","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { EventManager } from './utils/EventManager';\nimport type {\n MapViewProps,\n MapViewRef,\n NativeMapViewRef,\n CameraPosition,\n LatLng,\n Point,\n CircleProps,\n MarkerProps,\n PolylineProps,\n PolygonProps,\n} from './types';\n\nexport type { MapViewRef } from './types';\n\nconst NativeView: React.ComponentType<MapViewProps & { ref?: React.Ref<NativeMapViewRef> }> = requireNativeViewManager('ExpoGaodeMapView');\n\nexport const MapContext = React.createContext<React.RefObject<MapViewRef | null> | null>(null);\n\ntype MarkerEventCallbacks = {\n onPress?: () => void;\n onDragStart?: () => void;\n onDrag?: () => void;\n onDragEnd?: (event: { nativeEvent: LatLng }) => void;\n};\n\ntype OverlayEventCallbacks = {\n onPress?: () => void;\n};\n\nexport const MarkerEventContext = React.createContext<EventManager<MarkerEventCallbacks> | null>(null);\nexport const CircleEventContext = React.createContext<EventManager<OverlayEventCallbacks> | null>(null);\nexport const PolygonEventContext = React.createContext<EventManager<OverlayEventCallbacks> | null>(null);\nexport const PolylineEventContext = React.createContext<EventManager<OverlayEventCallbacks> | null>(null);\n\n/**\n * 高德地图视图组件,提供地图操作API和覆盖物管理功能\n * \n * @param props - 组件属性\n * @param ref - 外部ref引用,用于访问地图API方法\n * @returns 返回包含地图视图和上下文提供者的React组件\n * \n * @remarks\n * 该组件内部维护两个ref:\n * - nativeRef: 指向原生地图视图的引用\n * - internalRef: 内部使用的API引用,通过MapContext共享\n * \n * 提供的主要API功能包括:\n * - 相机控制(移动、缩放、获取当前位置)\n * - 覆盖物管理(添加/删除/更新标记、折线、多边形、圆形等)\n * \n * 所有API方法都会检查地图是否已初始化,未初始化时抛出错误\n */\nconst ExpoGaodeMapView = React.forwardRef<MapViewRef, MapViewProps>((props, ref) => {\n const nativeRef = React.useRef<NativeMapViewRef>(null);\n const internalRef = React.useRef<MapViewRef | null>(null);\n const markerEventManager = React.useMemo(() => new EventManager<MarkerEventCallbacks>(), []);\n const circleEventManager = React.useMemo(() => new EventManager<OverlayEventCallbacks>(), []);\n const polygonEventManager = React.useMemo(() => new EventManager<OverlayEventCallbacks>(), []);\n const polylineEventManager = React.useMemo(() => new EventManager<OverlayEventCallbacks>(), []);\n const handleMarkerPress = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) markerEventManager.trigger(markerId, 'onPress');\n props.onMarkerPress?.(event);\n };\n \n const handleMarkerDragStart = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) markerEventManager.trigger(markerId, 'onDragStart');\n props.onMarkerDragStart?.(event);\n };\n \n const handleMarkerDrag = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) markerEventManager.trigger(markerId, 'onDrag');\n props.onMarkerDrag?.(event);\n };\n \n const handleMarkerDragEnd = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) {\n markerEventManager.trigger(markerId, 'onDragEnd', {\n nativeEvent: {\n latitude: event.nativeEvent.latitude,\n longitude: event.nativeEvent.longitude\n }\n });\n }\n props.onMarkerDragEnd?.(event);\n };\n \n const handleCirclePress = (event: any) => {\n const circleId = event.nativeEvent?.circleId;\n if (circleId) circleEventManager.trigger(circleId, 'onPress');\n props.onCirclePress?.(event);\n };\n \n const handlePolygonPress = (event: any) => {\n const polygonId = event.nativeEvent?.polygonId;\n if (polygonId) polygonEventManager.trigger(polygonId, 'onPress');\n props.onPolygonPress?.(event);\n };\n \n const handlePolylinePress = (event: any) => {\n const polylineId = event.nativeEvent?.polylineId;\n if (polylineId) polylineEventManager.trigger(polylineId, 'onPress');\n props.onPolylinePress?.(event);\n };\n\n const apiRef: MapViewRef = React.useMemo(() => ({\n /**\n * 移动地图相机到指定位置\n * @param position 相机位置参数对象,包含目标经纬度、缩放级别等信息\n * @param duration 动画持续时间(毫秒),默认300毫秒\n * @throws 如果地图视图未初始化则抛出错误\n * @returns Promise<void> 异步操作完成后的Promise\n */\n moveCamera: async (position: CameraPosition, duration: number = 300) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.moveCamera(position, duration);\n },\n /**\n * 将屏幕坐标点转换为地理坐标(经纬度)\n * @param point 屏幕坐标点 {x: number, y: number}\n * @returns 返回Promise,解析为对应的地理坐标 {latitude: number, longitude: number}\n * @throws 如果地图视图未初始化,抛出错误 'MapView not initialized'\n */\n getLatLng: async (point: Point) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.getLatLng(point);\n },\n /**\n * 设置地图中心点坐标\n * @param center 要设置的中心点坐标(LatLng格式)\n * @param animated 是否使用动画效果移动地图(默认为false)\n * @throws 如果地图视图未初始化则抛出错误\n */\n setCenter: async (center: LatLng, animated: boolean = false) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.setCenter(center, animated);\n },\n /**\n * 设置地图的缩放级别\n * @param zoom 目标缩放级别\n * @param animated 是否使用动画过渡效果,默认为false\n * @throws 如果地图视图未初始化,抛出错误\n */\n setZoom: async (zoom: number, animated: boolean = false) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.setZoom(zoom, animated);\n },\n /**\n * 获取当前地图的相机位置(视角中心点、缩放级别、倾斜角度等)\n * @returns 返回一个Promise,解析为当前相机位置的对象\n * @throws 如果地图视图未初始化,则抛出错误\n */\n getCameraPosition: async () => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.getCameraPosition();\n },\n /**\n * 在地图上添加圆形覆盖物\n * @param id - 圆形覆盖物的唯一标识符\n * @param props - 圆形覆盖物的属性配置\n * @returns Promise<void> 添加操作的异步结果\n * @throws 如果地图视图未初始化,抛出错误'MapView not initialized'\n */\n addCircle: async (id: string, props: CircleProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addCircle(id, props);\n },\n /**\n * 从地图上移除指定的圆形覆盖物\n * @param id - 要移除的圆形覆盖物的唯一标识符\n * @throws 如果地图视图未初始化,抛出错误\n * @returns Promise<void> 异步操作完成\n */\n removeCircle: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removeCircle(id);\n },\n /**\n * 更新地图上的圆形覆盖物\n * @param id 要更新的圆形覆盖物的唯一标识符\n * @param props 要更新的圆形属性(部分属性)\n * @throws 如果地图视图未初始化,抛出错误\n * @returns Promise<void> 表示更新操作完成\n */\n updateCircle: async (id: string, props: Partial<CircleProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updateCircle(id, props);\n },\n /**\n * 添加一个标记点到地图上\n * @param id 标记点的唯一标识符\n * @param props 标记点的配置属性\n * @returns Promise<void> 添加操作完成后的Promise\n * @throws 如果地图视图未初始化则抛出错误\n */\n addMarker: async (id: string, props: MarkerProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addMarker(id, props);\n },\n /**\n * 从地图上移除指定ID的标记点\n * @param id 要移除的标记点ID\n * @throws 如果地图视图未初始化则抛出错误\n * @returns Promise<void> 异步操作完成\n */\n removeMarker: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removeMarker(id);\n },\n /**\n * 更新地图上指定ID的标记点属性\n * @param id - 要更新的标记点唯一标识符\n * @param props - 需要更新的标记点属性对象(部分属性)\n * @throws 如果地图视图未初始化则抛出错误\n * @returns Promise对象,表示异步更新操作\n */\n updateMarker: async (id: string, props: Partial<MarkerProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updateMarker(id, props);\n },\n /**\n * 添加折线覆盖物到地图\n * @param id - 折线的唯一标识符\n * @param props - 折线的配置属性\n * @returns Promise<void> 添加操作的异步结果\n * @throws 如果地图视图未初始化则抛出错误\n */\n addPolyline: async (id: string, props: PolylineProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addPolyline(id, props);\n },\n /**\n * 移除地图上的指定折线\n * @param id - 要移除的折线的唯一标识符\n * @throws 如果地图视图未初始化,抛出错误\n * @returns Promise<void>\n */\n removePolyline: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removePolyline(id);\n },\n /**\n * 更新地图上的折线覆盖物\n * \n * @param id 要更新的折线覆盖物的唯一标识符\n * @param props 要更新的折线属性,包含部分PolylineProps属性\n * @returns Promise<void> 异步操作结果\n * @throws 如果地图视图未初始化,抛出错误\n */\n updatePolyline: async (id: string, props: Partial<PolylineProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updatePolyline(id, props);\n },\n /**\n * 向地图添加多边形覆盖物\n * @param id - 多边形的唯一标识符\n * @param props - 多边形的配置属性\n * @returns Promise<void> 添加操作的异步结果\n * @throws 如果地图视图未初始化则抛出错误\n */\n addPolygon: async (id: string, props: PolygonProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addPolygon(id, props);\n },\n /**\n * 移除地图上的多边形覆盖物\n * @param id - 要移除的多边形覆盖物的唯一标识符\n * @throws 如果地图视图未初始化,抛出错误 'MapView not initialized'\n * @returns Promise<void> 异步操作完成\n */\n removePolygon: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removePolygon(id);\n },\n /**\n * 更新多边形覆盖物的属性\n * \n * @param id - 要更新的多边形覆盖物的唯一标识符\n * @param props - 要更新的多边形属性对象,包含需要更新的部分属性\n * @throws {Error} 当地图视图未初始化时抛出错误\n * @returns Promise<void> 异步操作完成后的Promise\n */\n updatePolygon: async (id: string, props: Partial<PolygonProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updatePolygon(id, props);\n },\n }), []);\n\n /**\n * 将传入的apiRef赋值给internalRef.current\n * 用于在组件内部保存对地图API实例的引用\n */\n React.useEffect(() => {\n internalRef.current = apiRef;\n }, [apiRef]);\n\n /**\n * 获取当前地图实例的API引用\n * @returns 返回地图API的引用对象,可用于调用地图相关方法\n */\n React.useImperativeHandle(ref, () => apiRef, [apiRef]);\n\n return (\n <MapContext.Provider value={internalRef}>\n <MarkerEventContext.Provider value={markerEventManager}>\n <CircleEventContext.Provider value={circleEventManager}>\n <PolygonEventContext.Provider value={polygonEventManager}>\n <PolylineEventContext.Provider value={polylineEventManager}>\n <NativeView\n ref={nativeRef}\n {...props}\n onMarkerPress={handleMarkerPress}\n onMarkerDragStart={handleMarkerDragStart}\n onMarkerDrag={handleMarkerDrag}\n onMarkerDragEnd={handleMarkerDragEnd}\n onCirclePress={handleCirclePress}\n onPolygonPress={handlePolygonPress}\n onPolylinePress={handlePolylinePress}\n >\n {props.children}\n </NativeView>\n </PolylineEventContext.Provider>\n </PolygonEventContext.Provider>\n </CircleEventContext.Provider>\n </MarkerEventContext.Provider>\n </MapContext.Provider>\n );\n});\n\nExpoGaodeMapView.displayName = 'ExpoGaodeMapView';\n\nexport default ExpoGaodeMapView;\n"]}
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapView.js","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { NativeSyntheticEvent } from 'react-native';\nimport { EventManager } from './utils/EventManager';\nimport type {\n MapViewProps,\n MapViewRef,\n NativeMapViewRef,\n CameraPosition,\n LatLng,\n Point,\n CircleProps,\n MarkerProps,\n PolylineProps,\n PolygonProps,\n} from './types';\n\nexport type { MapViewRef } from './types';\n\nconst NativeView: React.ComponentType<MapViewProps & { ref?: React.Ref<NativeMapViewRef> }> = requireNativeViewManager('ExpoGaodeMapView');\n\nexport const MapContext = React.createContext<React.RefObject<MapViewRef | null> | null>(null);\n\ntype MarkerEventCallbacks = {\n onPress?: (event: NativeSyntheticEvent<{}>) => void;\n onDragStart?: (event: NativeSyntheticEvent<LatLng>) => void;\n onDrag?: (event: NativeSyntheticEvent<LatLng>) => void;\n onDragEnd?: (event: NativeSyntheticEvent<LatLng>) => void;\n};\n\ntype OverlayEventCallbacks = {\n onPress?: (event: NativeSyntheticEvent<{}>) => void;\n};\n\nexport const MarkerEventContext = React.createContext<EventManager<MarkerEventCallbacks> | null>(null);\nexport const CircleEventContext = React.createContext<EventManager<OverlayEventCallbacks> | null>(null);\nexport const PolygonEventContext = React.createContext<EventManager<OverlayEventCallbacks> | null>(null);\nexport const PolylineEventContext = React.createContext<EventManager<OverlayEventCallbacks> | null>(null);\n\n/**\n * 高德地图视图组件,提供地图操作API和覆盖物管理功能\n * \n * @param props - 组件属性\n * @param ref - 外部ref引用,用于访问地图API方法\n * @returns 返回包含地图视图和上下文提供者的React组件\n * \n * @remarks\n * 该组件内部维护两个ref:\n * - nativeRef: 指向原生地图视图的引用\n * - internalRef: 内部使用的API引用,通过MapContext共享\n * \n * 提供的主要API功能包括:\n * - 相机控制(移动、缩放、获取当前位置)\n * - 覆盖物管理(添加/删除/更新标记、折线、多边形、圆形等)\n * \n * 所有API方法都会检查地图是否已初始化,未初始化时抛出错误\n */\nconst ExpoGaodeMapView = React.forwardRef<MapViewRef, MapViewProps>((props, ref) => {\n const nativeRef = React.useRef<NativeMapViewRef>(null);\n const internalRef = React.useRef<MapViewRef | null>(null);\n const markerEventManager = React.useMemo(() => new EventManager<MarkerEventCallbacks>(), []);\n const circleEventManager = React.useMemo(() => new EventManager<OverlayEventCallbacks>(), []);\n const polygonEventManager = React.useMemo(() => new EventManager<OverlayEventCallbacks>(), []);\n const polylineEventManager = React.useMemo(() => new EventManager<OverlayEventCallbacks>(), []);\n const handleMarkerPress = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) markerEventManager.trigger(markerId, 'onPress', event);\n props.onMarkerPress?.(event);\n };\n \n const handleMarkerDragStart = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) markerEventManager.trigger(markerId, 'onDragStart', event);\n props.onMarkerDragStart?.(event);\n };\n \n const handleMarkerDrag = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) markerEventManager.trigger(markerId, 'onDrag', event);\n props.onMarkerDrag?.(event);\n };\n \n const handleMarkerDragEnd = (event: any) => {\n const markerId = event.nativeEvent?.markerId;\n if (markerId) {\n markerEventManager.trigger(markerId, 'onDragEnd', event);\n }\n props.onMarkerDragEnd?.(event);\n };\n \n const handleCirclePress = (event: any) => {\n const circleId = event.nativeEvent?.circleId;\n if (circleId) circleEventManager.trigger(circleId, 'onPress', event);\n props.onCirclePress?.(event);\n };\n \n const handlePolygonPress = (event: any) => {\n const polygonId = event.nativeEvent?.polygonId;\n if (polygonId) polygonEventManager.trigger(polygonId, 'onPress', event);\n props.onPolygonPress?.(event);\n };\n \n const handlePolylinePress = (event: any) => {\n const polylineId = event.nativeEvent?.polylineId;\n if (polylineId) polylineEventManager.trigger(polylineId, 'onPress', event);\n props.onPolylinePress?.(event);\n };\n\n const apiRef: MapViewRef = React.useMemo(() => ({\n /**\n * 移动地图相机到指定位置\n * @param position 相机位置参数对象,包含目标经纬度、缩放级别等信息\n * @param duration 动画持续时间(毫秒),默认300毫秒\n * @throws 如果地图视图未初始化则抛出错误\n * @returns Promise<void> 异步操作完成后的Promise\n */\n moveCamera: async (position: CameraPosition, duration: number = 300) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.moveCamera(position, duration);\n },\n /**\n * 将屏幕坐标点转换为地理坐标(经纬度)\n * @param point 屏幕坐标点 {x: number, y: number}\n * @returns 返回Promise,解析为对应的地理坐标 {latitude: number, longitude: number}\n * @throws 如果地图视图未初始化,抛出错误 'MapView not initialized'\n */\n getLatLng: async (point: Point) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.getLatLng(point);\n },\n /**\n * 设置地图中心点坐标\n * @param center 要设置的中心点坐标(LatLng格式)\n * @param animated 是否使用动画效果移动地图(默认为false)\n * @throws 如果地图视图未初始化则抛出错误\n */\n setCenter: async (center: LatLng, animated: boolean = false) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.setCenter(center, animated);\n },\n /**\n * 设置地图的缩放级别\n * @param zoom 目标缩放级别\n * @param animated 是否使用动画过渡效果,默认为false\n * @throws 如果地图视图未初始化,抛出错误\n */\n setZoom: async (zoom: number, animated: boolean = false) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.setZoom(zoom, animated);\n },\n /**\n * 获取当前地图的相机位置(视角中心点、缩放级别、倾斜角度等)\n * @returns 返回一个Promise,解析为当前相机位置的对象\n * @throws 如果地图视图未初始化,则抛出错误\n */\n getCameraPosition: async () => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.getCameraPosition();\n },\n /**\n * 在地图上添加圆形覆盖物\n * @param id - 圆形覆盖物的唯一标识符\n * @param props - 圆形覆盖物的属性配置\n * @returns Promise<void> 添加操作的异步结果\n * @throws 如果地图视图未初始化,抛出错误'MapView not initialized'\n */\n addCircle: async (id: string, props: CircleProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addCircle(id, props);\n },\n /**\n * 从地图上移除指定的圆形覆盖物\n * @param id - 要移除的圆形覆盖物的唯一标识符\n * @throws 如果地图视图未初始化,抛出错误\n * @returns Promise<void> 异步操作完成\n */\n removeCircle: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removeCircle(id);\n },\n /**\n * 更新地图上的圆形覆盖物\n * @param id 要更新的圆形覆盖物的唯一标识符\n * @param props 要更新的圆形属性(部分属性)\n * @throws 如果地图视图未初始化,抛出错误\n * @returns Promise<void> 表示更新操作完成\n */\n updateCircle: async (id: string, props: Partial<CircleProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updateCircle(id, props);\n },\n /**\n * 添加一个标记点到地图上\n * @param id 标记点的唯一标识符\n * @param props 标记点的配置属性\n * @returns Promise<void> 添加操作完成后的Promise\n * @throws 如果地图视图未初始化则抛出错误\n */\n addMarker: async (id: string, props: MarkerProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addMarker(id, props);\n },\n /**\n * 从地图上移除指定ID的标记点\n * @param id 要移除的标记点ID\n * @throws 如果地图视图未初始化则抛出错误\n * @returns Promise<void> 异步操作完成\n */\n removeMarker: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removeMarker(id);\n },\n /**\n * 更新地图上指定ID的标记点属性\n * @param id - 要更新的标记点唯一标识符\n * @param props - 需要更新的标记点属性对象(部分属性)\n * @throws 如果地图视图未初始化则抛出错误\n * @returns Promise对象,表示异步更新操作\n */\n updateMarker: async (id: string, props: Partial<MarkerProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updateMarker(id, props);\n },\n /**\n * 添加折线覆盖物到地图\n * @param id - 折线的唯一标识符\n * @param props - 折线的配置属性\n * @returns Promise<void> 添加操作的异步结果\n * @throws 如果地图视图未初始化则抛出错误\n */\n addPolyline: async (id: string, props: PolylineProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addPolyline(id, props);\n },\n /**\n * 移除地图上的指定折线\n * @param id - 要移除的折线的唯一标识符\n * @throws 如果地图视图未初始化,抛出错误\n * @returns Promise<void>\n */\n removePolyline: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removePolyline(id);\n },\n /**\n * 更新地图上的折线覆盖物\n * \n * @param id 要更新的折线覆盖物的唯一标识符\n * @param props 要更新的折线属性,包含部分PolylineProps属性\n * @returns Promise<void> 异步操作结果\n * @throws 如果地图视图未初始化,抛出错误\n */\n updatePolyline: async (id: string, props: Partial<PolylineProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updatePolyline(id, props);\n },\n /**\n * 向地图添加多边形覆盖物\n * @param id - 多边形的唯一标识符\n * @param props - 多边形的配置属性\n * @returns Promise<void> 添加操作的异步结果\n * @throws 如果地图视图未初始化则抛出错误\n */\n addPolygon: async (id: string, props: PolygonProps) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.addPolygon(id, props);\n },\n /**\n * 移除地图上的多边形覆盖物\n * @param id - 要移除的多边形覆盖物的唯一标识符\n * @throws 如果地图视图未初始化,抛出错误 'MapView not initialized'\n * @returns Promise<void> 异步操作完成\n */\n removePolygon: async (id: string) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.removePolygon(id);\n },\n /**\n * 更新多边形覆盖物的属性\n * \n * @param id - 要更新的多边形覆盖物的唯一标识符\n * @param props - 要更新的多边形属性对象,包含需要更新的部分属性\n * @throws {Error} 当地图视图未初始化时抛出错误\n * @returns Promise<void> 异步操作完成后的Promise\n */\n updatePolygon: async (id: string, props: Partial<PolygonProps>) => {\n if (!nativeRef.current) throw new Error('MapView not initialized');\n return nativeRef.current.updatePolygon(id, props);\n },\n }), []);\n\n /**\n * 将传入的apiRef赋值给internalRef.current\n * 用于在组件内部保存对地图API实例的引用\n */\n React.useEffect(() => {\n internalRef.current = apiRef;\n }, [apiRef]);\n\n /**\n * 获取当前地图实例的API引用\n * @returns 返回地图API的引用对象,可用于调用地图相关方法\n */\n React.useImperativeHandle(ref, () => apiRef, [apiRef]);\n\n return (\n <MapContext.Provider value={internalRef}>\n <MarkerEventContext.Provider value={markerEventManager}>\n <CircleEventContext.Provider value={circleEventManager}>\n <PolygonEventContext.Provider value={polygonEventManager}>\n <PolylineEventContext.Provider value={polylineEventManager}>\n <NativeView\n ref={nativeRef}\n {...props}\n onMarkerPress={handleMarkerPress}\n onMarkerDragStart={handleMarkerDragStart}\n onMarkerDrag={handleMarkerDrag}\n onMarkerDragEnd={handleMarkerDragEnd}\n onCirclePress={handleCirclePress}\n onPolygonPress={handlePolygonPress}\n onPolylinePress={handlePolylinePress}\n >\n {props.children}\n </NativeView>\n </PolylineEventContext.Provider>\n </PolygonEventContext.Provider>\n </CircleEventContext.Provider>\n </MarkerEventContext.Provider>\n </MapContext.Provider>\n );\n});\n\nExpoGaodeMapView.displayName = 'ExpoGaodeMapView';\n\nexport default ExpoGaodeMapView;\n"]}
|