expo-gaode-map 2.2.13-next.0 → 2.2.14
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/AndroidManifest.xml +1 -5
- package/android/src/main/java/expo/modules/gaodemap/ExpoGaodeMapModule.kt +11 -2
- package/android/src/main/java/expo/modules/gaodemap/overlays/PolylineView.kt +65 -51
- package/build/ExpoGaodeMapModule.d.ts +9 -0
- package/build/ExpoGaodeMapModule.d.ts.map +1 -1
- package/build/ExpoGaodeMapModule.js.map +1 -1
- package/build/ExpoGaodeMapView.d.ts.map +1 -1
- package/build/ExpoGaodeMapView.js +23 -3
- package/build/ExpoGaodeMapView.js.map +1 -1
- package/build/components/FoldableMapView.d.ts.map +1 -1
- package/build/components/FoldableMapView.js +2 -2
- package/build/components/FoldableMapView.js.map +1 -1
- package/build/components/MapContext.d.ts +13 -0
- package/build/components/MapContext.d.ts.map +1 -0
- package/build/components/MapContext.js +18 -0
- package/build/components/MapContext.js.map +1 -0
- package/build/components/MapUI.d.ts +19 -0
- package/build/components/MapUI.d.ts.map +1 -0
- package/build/components/MapUI.js +23 -0
- package/build/components/MapUI.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/utils/ModuleLoader.js +1 -1
- package/build/utils/ModuleLoader.js.map +1 -1
- package/ios/ExpoGaodeMapModule.swift +9 -1
- package/package.json +4 -3
|
@@ -6,11 +6,7 @@
|
|
|
6
6
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
7
7
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
|
11
|
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
12
|
-
|
|
13
|
-
<application>
|
|
9
|
+
<application allowBackup="false" >
|
|
14
10
|
|
|
15
11
|
<!-- 高德地图定位服务 (必需) -->
|
|
16
12
|
<service
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package expo.modules.gaodemap
|
|
2
2
|
|
|
3
3
|
import com.amap.api.maps.AMapUtils
|
|
4
|
+
import com.amap.api.maps.MapsInitializer
|
|
4
5
|
import com.amap.api.maps.model.LatLng
|
|
5
6
|
import expo.modules.kotlin.modules.Module
|
|
6
7
|
import expo.modules.kotlin.modules.ModuleDefinition
|
|
@@ -87,14 +88,22 @@ class ExpoGaodeMapModule : Module() {
|
|
|
87
88
|
getLocationManager() // 初始化定位管理器
|
|
88
89
|
} catch (e: SecurityException) {
|
|
89
90
|
android.util.Log.e("ExpoGaodeMap", "隐私协议未同意: ${e.message}")
|
|
90
|
-
throw e
|
|
91
|
+
throw expo.modules.kotlin.exception.CodedException("PRIVACY_NOT_AGREED", e.message ?: "用户未同意隐私协议", e)
|
|
91
92
|
} catch (e: Exception) {
|
|
92
93
|
android.util.Log.e("ExpoGaodeMap", "SDK 初始化失败: ${e.message}")
|
|
93
|
-
throw e
|
|
94
|
+
throw expo.modules.kotlin.exception.CodedException("INIT_FAILED", e.message ?: "SDK 初始化失败", e)
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
|
|
99
|
+
/**
|
|
100
|
+
* 设置是否加载世界向量地图
|
|
101
|
+
* @param enable 是否开启
|
|
102
|
+
*/
|
|
103
|
+
Function("setLoadWorldVectorMap") { enable: Boolean ->
|
|
104
|
+
MapsInitializer.loadWorldVectorMap(enable)
|
|
105
|
+
}
|
|
106
|
+
|
|
98
107
|
/**
|
|
99
108
|
* 获取 SDK 版本
|
|
100
109
|
* @return SDK 版本号
|
|
@@ -82,8 +82,12 @@ class PolylineView(context: Context, appContext: AppContext) : ExpoView(context,
|
|
|
82
82
|
* 设置是否虚线
|
|
83
83
|
*/
|
|
84
84
|
fun setDotted(dotted: Boolean) {
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
try {
|
|
86
|
+
isDotted = dotted
|
|
87
|
+
createOrUpdatePolyline()
|
|
88
|
+
} catch (e: Throwable) {
|
|
89
|
+
android.util.Log.e("PolylineView", "setDotted failed", e)
|
|
90
|
+
}
|
|
87
91
|
}
|
|
88
92
|
|
|
89
93
|
/**
|
|
@@ -131,64 +135,74 @@ class PolylineView(context: Context, appContext: AppContext) : ExpoView(context,
|
|
|
131
135
|
*/
|
|
132
136
|
private fun createOrUpdatePolyline() {
|
|
133
137
|
aMap?.let { map ->
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (points.isNotEmpty()) {
|
|
139
|
-
val options = PolylineOptions()
|
|
140
|
-
.addAll(points)
|
|
141
|
-
.width(strokeWidth)
|
|
142
|
-
.color(strokeColor)
|
|
143
|
-
.geodesic(isGeodesic)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
// 设置虚线样式
|
|
147
|
-
if (isDotted) {
|
|
148
|
-
options.dottedLineType = PolylineOptions.DOTTEDLINE_TYPE_SQUARE
|
|
149
|
-
}
|
|
138
|
+
try {
|
|
139
|
+
// 移除旧折线
|
|
140
|
+
polyline?.remove()
|
|
141
|
+
polyline = null
|
|
150
142
|
|
|
151
|
-
|
|
152
|
-
|
|
143
|
+
if (points.isNotEmpty()) {
|
|
144
|
+
val options = PolylineOptions()
|
|
145
|
+
.addAll(points)
|
|
146
|
+
.width(strokeWidth)
|
|
147
|
+
.color(strokeColor)
|
|
148
|
+
.geodesic(isGeodesic)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
// 设置虚线样式
|
|
153
152
|
try {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
153
|
+
options.setDottedLine(isDotted)
|
|
154
|
+
if (isDotted) {
|
|
155
|
+
options.setDottedLineType(PolylineOptions.DOTTEDLINE_TYPE_SQUARE)
|
|
156
|
+
}
|
|
157
|
+
} catch (e: Throwable) {
|
|
158
|
+
// 忽略虚线设置错误,防止崩溃
|
|
159
|
+
android.util.Log.e("PolylineView", "设置虚线失败", e)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 设置纹理
|
|
163
|
+
textureUrl?.let { url ->
|
|
164
|
+
try {
|
|
165
|
+
when {
|
|
166
|
+
url.startsWith("http://") || url.startsWith("https://") -> {
|
|
167
|
+
// 网络图片异步加载
|
|
168
|
+
Thread {
|
|
169
|
+
try {
|
|
170
|
+
val connection = URL(url).openConnection()
|
|
171
|
+
val inputStream = connection.getInputStream()
|
|
172
|
+
val bitmap = android.graphics.BitmapFactory.decodeStream(inputStream)
|
|
173
|
+
inputStream.close()
|
|
174
|
+
post {
|
|
175
|
+
polyline?.setCustomTexture(BitmapDescriptorFactory.fromBitmap(bitmap))
|
|
176
|
+
}
|
|
177
|
+
} catch (e: Exception) {
|
|
178
|
+
e.printStackTrace()
|
|
165
179
|
}
|
|
166
|
-
}
|
|
167
|
-
|
|
180
|
+
}.start()
|
|
181
|
+
}
|
|
182
|
+
url.startsWith("file://") -> {
|
|
183
|
+
val path = url.substring(7)
|
|
184
|
+
val bitmap = android.graphics.BitmapFactory.decodeFile(path)
|
|
185
|
+
bitmap?.let { options.setCustomTexture(BitmapDescriptorFactory.fromBitmap(it)) }
|
|
186
|
+
}
|
|
187
|
+
else -> {
|
|
188
|
+
val resId = context.resources.getIdentifier(url, "drawable", context.packageName)
|
|
189
|
+
if (resId != 0) {
|
|
190
|
+
val bitmap = android.graphics.BitmapFactory.decodeResource(context.resources, resId)
|
|
191
|
+
options.setCustomTexture(BitmapDescriptorFactory.fromBitmap(bitmap))
|
|
192
|
+
}else{
|
|
193
|
+
|
|
168
194
|
}
|
|
169
|
-
}.start()
|
|
170
|
-
}
|
|
171
|
-
url.startsWith("file://") -> {
|
|
172
|
-
val path = url.substring(7)
|
|
173
|
-
val bitmap = android.graphics.BitmapFactory.decodeFile(path)
|
|
174
|
-
bitmap?.let { options.setCustomTexture(BitmapDescriptorFactory.fromBitmap(it)) }
|
|
175
|
-
}
|
|
176
|
-
else -> {
|
|
177
|
-
val resId = context.resources.getIdentifier(url, "drawable", context.packageName)
|
|
178
|
-
if (resId != 0) {
|
|
179
|
-
val bitmap = android.graphics.BitmapFactory.decodeResource(context.resources, resId)
|
|
180
|
-
options.setCustomTexture(BitmapDescriptorFactory.fromBitmap(bitmap))
|
|
181
|
-
}else{
|
|
182
|
-
|
|
183
195
|
}
|
|
184
196
|
}
|
|
197
|
+
} catch (e: Exception) {
|
|
198
|
+
e.printStackTrace()
|
|
185
199
|
}
|
|
186
|
-
} catch (e: Exception) {
|
|
187
|
-
e.printStackTrace()
|
|
188
200
|
}
|
|
201
|
+
|
|
202
|
+
polyline = map.addPolyline(options)
|
|
189
203
|
}
|
|
190
|
-
|
|
191
|
-
polyline
|
|
204
|
+
} catch (e: Throwable) {
|
|
205
|
+
android.util.Log.e("PolylineView", "Error creating/updating polyline", e)
|
|
192
206
|
}
|
|
193
207
|
}
|
|
194
208
|
}
|
|
@@ -22,6 +22,15 @@ declare class ExpoGaodeMapModule extends NativeModule<ExpoGaodeMapModuleEvents>
|
|
|
22
22
|
* @param config SDK 配置参数,包含 Android 和 iOS 的 API Key
|
|
23
23
|
*/
|
|
24
24
|
initSDK(config: SDKConfig): void;
|
|
25
|
+
/**
|
|
26
|
+
* 设置是否加载世界向量地图(海外地图)
|
|
27
|
+
* 必须在地图初始化之前调用
|
|
28
|
+
* 世界地图为高级服务,需要开通相关权限:
|
|
29
|
+
* 1.注册成为高德开放平台开发者,并申请 注册 key
|
|
30
|
+
* 2.通过 工单 联系商务开通
|
|
31
|
+
* @param enabled 是否开启
|
|
32
|
+
*/
|
|
33
|
+
setLoadWorldVectorMap(enabled: boolean): void;
|
|
25
34
|
/**
|
|
26
35
|
* 获取高德地图 SDK 版本号
|
|
27
36
|
* @returns SDK 版本字符串
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapModule.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapModule.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapModule.js","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 高德地图原生模块\n * 提供 SDK 初始化、定位、权限管理等功能\n */\n\nimport { NativeModule, requireNativeModule } from 'expo';\n\nimport type {\n LatLng,\n CoordinateType,\n Coordinates,\n ReGeocode,\n LocationMode,\n LocationAccuracy,\n LocationListener,\n} from './types';\nimport { ErrorHandler, ErrorLogger } from './utils/ErrorHandler';\nimport { ExpoGaodeMapModuleEvents } from './types/map-view.types';\nimport { SDKConfig, PermissionStatus } from './types/common.types';\n\n\n/**\n * 高德地图原生模块类声明\n */\ndeclare class ExpoGaodeMapModule extends NativeModule<ExpoGaodeMapModuleEvents> {\n // ==================== 隐私合规管理 ====================\n\n /**\n * 更新隐私合规状态\n * 必须在用户同意隐私协议后调用\n * @param hasAgreed 用户是否已同意隐私协议\n * @deprecated 已经弃用,原生里默认为已同意,不再需要调用\n */\n updatePrivacyCompliance(hasAgreed: boolean): void;\n\n // ==================== SDK 初始化 ====================\n\n /**\n * 初始化高德地图 SDK\n * @param config SDK 配置参数,包含 Android 和 iOS 的 API Key\n */\n initSDK(config: SDKConfig): void;\n\n /**\n * 获取高德地图 SDK 版本号\n * @returns SDK 版本字符串\n */\n getVersion(): string;\n\n\n // ==================== 定位控制 ====================\n\n /**\n * 开始连续定位\n * 启动后会持续接收位置更新,通过 onLocationUpdate 事件回调\n */\n start(): void;\n\n /**\n * 停止定位\n * 停止接收位置更新\n */\n stop(): void;\n\n /**\n * 检查是否正在定位\n * @returns Promise<boolean> 是否正在定位\n */\n isStarted(): Promise<boolean>;\n\n /**\n * 获取当前位置(单次定位)\n * @returns Promise<Coordinates | ReGeocode> 位置信息,包含坐标和可选的逆地理编码信息\n */\n getCurrentLocation(): Promise<Coordinates | ReGeocode>;\n\n /**\n * 坐标转换\n * 将其他坐标系的坐标转换为高德地图使用的 GCJ-02 坐标系\n * @param coordinate 需要转换的坐标\n * @param type 原坐标系类型\n * @returns Promise<LatLng> 转换后的 GCJ-02 坐标\n */\n coordinateConvert(coordinate: LatLng, type: CoordinateType): Promise<LatLng>;\n\n // ==================== 定位配置 ====================\n\n /**\n * 设置是否返回逆地理编码信息\n * @param isReGeocode true: 返回地址信息; false: 只返回坐标\n */\n setLocatingWithReGeocode(isReGeocode: boolean): void;\n\n /**\n * 设置定位模式(Android)\n * @param mode 定位模式:0-低功耗, 1-仅设备, 2-高精度\n */\n setLocationMode(mode: LocationMode): void;\n\n /**\n * 设置定位间隔(毫秒)\n * @param interval 定位间隔时间,单位毫秒,默认 2000ms\n */\n setInterval(interval: number): void;\n\n /**\n * 设置是否单次定位(Android)\n * @param isOnceLocation true: 单次定位; false: 连续定位\n */\n setOnceLocation(isOnceLocation: boolean): void;\n\n /**\n * 设置是否使用设备传感器(Android)\n * @param sensorEnable true: 使用传感器; false: 不使用\n */\n setSensorEnable(sensorEnable: boolean): void;\n\n /**\n * 设置是否允许 WiFi 扫描(Android)\n * @param wifiScan true: 允许; false: 不允许\n */\n setWifiScan(wifiScan: boolean): void;\n\n /**\n * 设置是否 GPS 优先(Android)\n * @param gpsFirst true: GPS 优先; false: 网络优先\n */\n setGpsFirst(gpsFirst: boolean): void;\n\n /**\n * 设置是否等待 WiFi 列表刷新(Android)\n * @param onceLocationLatest true: 等待; false: 不等待\n */\n setOnceLocationLatest(onceLocationLatest: boolean): void;\n\n /**\n * 设置逆地理编码语言\n * @param language 语言代码,如 \"zh-CN\", \"en\"\n */\n setGeoLanguage(language: string): void;\n\n /**\n * 设置是否使用缓存策略(Android)\n * @param locationCacheEnable true: 使用缓存; false: 不使用\n */\n setLocationCacheEnable(locationCacheEnable: boolean): void;\n\n /**\n * 设置网络请求超时时间(Android)\n * @param httpTimeOut 超时时间,单位毫秒\n */\n setHttpTimeOut(httpTimeOut: number): void;\n\n /**\n * 设置期望的定位精度(iOS)\n * @param accuracy 精度级别:0-最佳, 1-10米, 2-100米, 3-1公里, 4-3公里\n */\n setDesiredAccuracy(accuracy: LocationAccuracy): void;\n\n /**\n * 设置定位超时时间(秒)\n * @param timeout 超时时间,单位秒,默认 10 秒\n */\n setLocationTimeout(timeout: number): void;\n\n /**\n * 设置逆地理编码超时时间(秒)\n * @param timeout 超时时间,单位秒,默认 5 秒\n */\n setReGeocodeTimeout(timeout: number): void;\n\n /**\n * 设置距离过滤器(米)(iOS)\n * 只有移动超过指定距离才会更新位置\n * @param distance 距离阈值,单位米\n */\n setDistanceFilter(distance: number): void;\n\n /**\n * 设置是否自动暂停位置更新(iOS)\n * @param pauses true: 自动暂停; false: 不暂停\n */\n setPausesLocationUpdatesAutomatically(pauses: boolean): void;\n\n /**\n * 设置是否允许后台定位(iOS)\n * @param allows true: 允许; false: 不允许\n */\n setAllowsBackgroundLocationUpdates(allows: boolean): void;\n\n /**\n * 设置定位协议\n * @param protocol 协议类型\n */\n setLocationProtocol(protocol: string): void;\n\n // ==================== 方向更新 (iOS) ====================\n\n /**\n * 开始更新设备方向(罗盘朝向)\n * 通过 onHeadingUpdate 事件接收方向更新\n * @platform ios\n */\n startUpdatingHeading(): void;\n\n /**\n * 停止更新设备方向\n * @platform ios\n */\n stopUpdatingHeading(): void;\n\n // ==================== 权限管理(增强版) ====================\n\n /**\n * 检查前台位置权限状态(增强版,支持 Android 14+ 适配)\n * @returns Promise<PermissionStatus> 详细的权限状态信息\n */\n checkLocationPermission(): Promise<PermissionStatus>;\n\n /**\n * 请求前台位置权限(增强版,支持 Android 14+ 适配)\n * @returns Promise<PermissionStatus> 请求后的权限状态\n */\n requestLocationPermission(): Promise<PermissionStatus>;\n\n /**\n * 请求后台位置权限(Android 10+、iOS)\n * 注意:必须在前台权限已授予后才能请求\n * @returns Promise<PermissionStatus> 请求后的权限状态\n */\n requestBackgroundLocationPermission(): Promise<PermissionStatus>;\n\n /**\n * 打开应用设置页面\n * 引导用户手动授予权限(当权限被永久拒绝时使用)\n */\n openAppSettings(): void;\n\n // ==================== 地图预加载 ====================\n\n /**\n * 开始预加载地图实例\n * 在后台预先初始化地图视图,提升首次显示速度,一般不用主动调用\n * @param config 预加载配置对象\n * @param config.poolSize 预加载的地图实例数量,默认 2\n */\n startMapPreload(config: { poolSize?: number }): void;\n\n /**\n * 获取预加载状态\n * @returns 预加载状态信息,包含池大小、是否正在预加载等,一般不用主动调用\n */\n getMapPreloadStatus(): {\n poolSize: number;\n isPreloading: boolean;\n maxPoolSize: number;\n };\n\n /**\n * 清空预加载池\n * 释放所有预加载的地图实例,一般不用主动调用\n */\n clearMapPreloadPool(): void;\n\n /**\n * 检查是否有可用的预加载实例\n * @returns 是否有可用的预加载地图实例,一般不用主动调用\n */\n hasPreloadedMapView(): boolean;\n\n /**\n * 检查原生 SDK 是否已配置 API Key\n * @returns 是否已配置\n */\n isNativeSDKConfigured(): boolean;\n\n // ==================== 便捷方法 ====================\n\n /**\n * 添加定位监听器(便捷方法)\n * 封装了 addListener,提供更简洁的 API\n * @param listener 定位回调函数\n * @returns 订阅对象,调用 remove() 取消监听\n */\n addLocationListener(listener: LocationListener): { remove: () => void };\n\n\n // ==================== 几何计算 ====================\n\n /**\n * 计算两个坐标点之间的距离\n * @param coordinate1 第一个坐标点\n * @param coordinate2 第二个坐标点\n * @returns 两点之间的距离(单位:米)\n */\n distanceBetweenCoordinates(coordinate1: LatLng,coordinate2: LatLng): Promise<number>;\n\n\n /**\n * 判断点是否在圆内\n * @param point 要判断的点\n * @param center 圆心坐标\n * @param radius 圆半径(单位:米)\n * @returns 是否在圆内\n */\n isPointInCircle(point: LatLng,center: LatLng,radius: number): Promise<boolean>;\n\n /**\n * 判断点是否在多边形内\n * @param point 要判断的点\n * @param polygon 多边形的顶点坐标数组\n * @returns 是否在多边形内\n */\n isPointInPolygon(point: LatLng,polygon: LatLng[]): Promise<boolean>;\n\n /**\n * 计算多边形面积\n * @param polygon 多边形的顶点坐标数组\n * @returns 面积(单位:平方米)\n */\n calculatePolygonArea(polygon: LatLng[]): Promise<number>;\n\n /**\n * 计算矩形面积\n * @param southWest 西南角坐标\n * @param northEast 东北角坐标\n * @returns 面积(单位:平方米)\n */\n calculateRectangleArea(southWest: LatLng,northEast: LatLng): Promise<number>;\n\n\n}\n\n// 获取原生模块实例 - 添加容错处理\nlet nativeModule: ExpoGaodeMapModule | null = null;\n\ntry {\n nativeModule = requireNativeModule<ExpoGaodeMapModule>('ExpoGaodeMap');\n} catch (error) {\n const moduleError = ErrorHandler.nativeModuleUnavailable();\n ErrorLogger.log(moduleError);\n}\n\n// 记录最近一次 initSDK 的配置(含 webKey)\nlet _sdkConfig: SDKConfig | null = null;\nlet _isSDKInitialized = false;\n\n// 扩展原生模块,添加便捷方法\nconst ExpoGaodeMapModuleWithHelpers = {\n ...(nativeModule || {}),\n\n /**\n * 初始化 SDK,并缓存配置(包含 webKey)\n * 注意:允许不提供任何 API Key,因为原生端可能已通过 Config Plugin 配置\n */\n initSDK(config: SDKConfig): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n\n // 检查是否有任何 key 被提供\n const hasJSKeys = !!(config.androidKey || config.iosKey);\n const hasWebKey = !!config.webKey;\n // 如果 JS 端没有提供 androidKey/iosKey,检查原生端是否已配置\n if (!hasJSKeys) {\n const isNativeConfigured = nativeModule.isNativeSDKConfigured();\n if (!isNativeConfigured && !hasWebKey){\n throw ErrorHandler.invalidApiKey('both');\n }\n // 如果原生已配置,或者只提供了 webKey,继续初始化\n ErrorLogger.warn(\n isNativeConfigured \n ? 'SDK 使用原生端配置的 API Key' \n : 'SDK 初始化仅使用 webKey',\n { config }\n );\n }\n _sdkConfig = config ?? null;\n nativeModule.initSDK(config);\n _isSDKInitialized = true;\n ErrorLogger.warn('SDK 初始化成功', { config });\n } catch (error: any) {\n _isSDKInitialized = false;\n throw ErrorHandler.wrapNativeError(error, 'SDK 初始化');\n }\n },\n\n /**\n * 检查 SDK 是否已通过 JS 调用 initSDK() 初始化\n * 注意:即使返回 false,原生端可能已通过 Config Plugin 自动初始化\n */\n isSDKInitialized(): boolean {\n return _isSDKInitialized;\n },\n\n /**\n * 开始连续定位\n * 注意:如果使用 Config Plugin 配置了 API Key,无需调用 initSDK()\n */\n start(): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n nativeModule.start();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '开始定位');\n }\n },\n\n /**\n * 停止定位\n */\n stop(): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n nativeModule.stop();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '停止定位');\n }\n },\n\n /**\n * 获取当前位置(单次定位)\n * 注意:如果使用 Config Plugin 配置了 API Key,无需调用 initSDK()\n */\n async getCurrentLocation(): Promise<Coordinates | ReGeocode> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.getCurrentLocation();\n } catch (error: any) {\n throw ErrorHandler.locationFailed(error?.message);\n }\n },\n\n /**\n * 检查位置权限状态\n */\n async checkLocationPermission(): Promise<PermissionStatus> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.checkLocationPermission();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '检查权限');\n }\n },\n\n /**\n * 请求前台位置权限(增强版)\n */\n async requestLocationPermission(): Promise<PermissionStatus> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n const result = await nativeModule.requestLocationPermission();\n if (!result.granted) {\n ErrorLogger.warn('前台位置权限未授予', result);\n }\n return result;\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '请求前台权限');\n }\n },\n\n /**\n * 请求后台位置权限\n * 注意:必须在前台权限已授予后才能请求\n */\n async requestBackgroundLocationPermission(): Promise<PermissionStatus> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n const result = await nativeModule.requestBackgroundLocationPermission();\n if (!result.granted) {\n ErrorLogger.warn('后台位置权限未授予', result);\n }\n return result;\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '请求后台权限');\n }\n },\n\n /**\n * 打开应用设置页面\n * 引导用户手动授予权限\n */\n openAppSettings(): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n nativeModule.openAppSettings();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '打开设置');\n }\n },\n\n /**\n * 添加定位监听器(便捷方法)\n * 自动订阅 onLocationUpdate 事件,提供容错处理\n * @param listener 定位回调函数\n * @returns 订阅对象,调用 remove() 取消监听\n * 注意:如果使用 Config Plugin 配置了 API Key,无需调用 initSDK()\n */\n addLocationListener(listener: LocationListener): { remove: () => void } {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n if (!nativeModule?.addListener) {\n ErrorLogger.warn('Native module does not support events');\n }\n // 使用可选链和空值合并,确保即使模块不可用也不会崩溃\n return nativeModule?.addListener?.('onLocationUpdate', listener) || {\n remove: () => { },\n };\n },\n\n // ==================== 几何计算方法 ====================\n\n /**\n * 计算两个坐标点之间的距离\n * @param coordinate1 第一个坐标点\n * @param coordinate2 第二个坐标点\n * @returns 两点之间的距离(单位:米)\n */\n async distanceBetweenCoordinates(coordinate1: LatLng, coordinate2: LatLng): Promise<number> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.distanceBetweenCoordinates(coordinate1, coordinate2);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '计算距离');\n }\n },\n\n /**\n * 判断点是否在圆内\n * @param point 要判断的点\n * @param center 圆心坐标\n * @param radius 圆半径(单位:米)\n * @returns 是否在圆内\n */\n async isPointInCircle(point: LatLng, center: LatLng, radius: number): Promise<boolean> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.isPointInCircle(point, center, radius);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在圆内');\n }\n },\n\n /**\n * 判断点是否在多边形内\n * @param point 要判断的点\n * @param polygon 多边形的顶点坐标数组\n * @returns 是否在多边形内\n */\n async isPointInPolygon(point: LatLng, polygon: LatLng[]): Promise<boolean> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.isPointInPolygon(point, polygon);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在多边形内');\n }\n },\n\n /**\n * 计算多边形面积\n * @param polygon 多边形的顶点坐标数组\n * @returns 面积(单位:平方米)\n */\n async calculatePolygonArea(polygon: LatLng[]): Promise<number> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.calculatePolygonArea(polygon);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '计算多边形面积');\n }\n },\n\n /**\n * 计算矩形面积\n * @param southWest 西南角坐标\n * @param northEast 东北角坐标\n * @returns 面积(单位:平方米)\n */\n async calculateRectangleArea(southWest: LatLng, northEast: LatLng): Promise<number> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.calculateRectangleArea(southWest, northEast);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '计算矩形面积');\n }\n },\n};\n\n/**\n* 获取最近一次 initSDK 的配置\n*/\nexport function getSDKConfig(): SDKConfig | null {\n return _sdkConfig;\n}\n\n/**\n* 获取用于 Web API 的 webKey(若未初始化或未提供则返回 undefined)\n*/\nexport function getWebKey(): string | undefined {\n return _sdkConfig?.webKey;\n}\n\nexport default ExpoGaodeMapModuleWithHelpers as unknown as ExpoGaodeMapModule;\n"]}
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapModule.js","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 高德地图原生模块\n * 提供 SDK 初始化、定位、权限管理等功能\n */\n\nimport { NativeModule, requireNativeModule } from 'expo';\n\nimport type {\n LatLng,\n CoordinateType,\n Coordinates,\n ReGeocode,\n LocationMode,\n LocationAccuracy,\n LocationListener,\n} from './types';\nimport { ErrorHandler, ErrorLogger } from './utils/ErrorHandler';\nimport { ExpoGaodeMapModuleEvents } from './types/map-view.types';\nimport { SDKConfig, PermissionStatus } from './types/common.types';\n\n\n/**\n * 高德地图原生模块类声明\n */\ndeclare class ExpoGaodeMapModule extends NativeModule<ExpoGaodeMapModuleEvents> {\n // ==================== 隐私合规管理 ====================\n\n /**\n * 更新隐私合规状态\n * 必须在用户同意隐私协议后调用\n * @param hasAgreed 用户是否已同意隐私协议\n * @deprecated 已经弃用,原生里默认为已同意,不再需要调用\n */\n updatePrivacyCompliance(hasAgreed: boolean): void;\n\n // ==================== SDK 初始化 ====================\n\n /**\n * 初始化高德地图 SDK\n * @param config SDK 配置参数,包含 Android 和 iOS 的 API Key\n */\n initSDK(config: SDKConfig): void;\n\n /**\n * 设置是否加载世界向量地图(海外地图)\n * 必须在地图初始化之前调用\n * 世界地图为高级服务,需要开通相关权限:\n * 1.注册成为高德开放平台开发者,并申请 注册 key\n * 2.通过 工单 联系商务开通\n * @param enabled 是否开启\n */\n setLoadWorldVectorMap(enabled: boolean): void;\n\n /**\n * 获取高德地图 SDK 版本号\n * @returns SDK 版本字符串\n */\n getVersion(): string;\n\n\n // ==================== 定位控制 ====================\n\n /**\n * 开始连续定位\n * 启动后会持续接收位置更新,通过 onLocationUpdate 事件回调\n */\n start(): void;\n\n /**\n * 停止定位\n * 停止接收位置更新\n */\n stop(): void;\n\n /**\n * 检查是否正在定位\n * @returns Promise<boolean> 是否正在定位\n */\n isStarted(): Promise<boolean>;\n\n /**\n * 获取当前位置(单次定位)\n * @returns Promise<Coordinates | ReGeocode> 位置信息,包含坐标和可选的逆地理编码信息\n */\n getCurrentLocation(): Promise<Coordinates | ReGeocode>;\n\n /**\n * 坐标转换\n * 将其他坐标系的坐标转换为高德地图使用的 GCJ-02 坐标系\n * @param coordinate 需要转换的坐标\n * @param type 原坐标系类型\n * @returns Promise<LatLng> 转换后的 GCJ-02 坐标\n */\n coordinateConvert(coordinate: LatLng, type: CoordinateType): Promise<LatLng>;\n\n // ==================== 定位配置 ====================\n\n /**\n * 设置是否返回逆地理编码信息\n * @param isReGeocode true: 返回地址信息; false: 只返回坐标\n */\n setLocatingWithReGeocode(isReGeocode: boolean): void;\n\n /**\n * 设置定位模式(Android)\n * @param mode 定位模式:0-低功耗, 1-仅设备, 2-高精度\n */\n setLocationMode(mode: LocationMode): void;\n\n /**\n * 设置定位间隔(毫秒)\n * @param interval 定位间隔时间,单位毫秒,默认 2000ms\n */\n setInterval(interval: number): void;\n\n /**\n * 设置是否单次定位(Android)\n * @param isOnceLocation true: 单次定位; false: 连续定位\n */\n setOnceLocation(isOnceLocation: boolean): void;\n\n /**\n * 设置是否使用设备传感器(Android)\n * @param sensorEnable true: 使用传感器; false: 不使用\n */\n setSensorEnable(sensorEnable: boolean): void;\n\n /**\n * 设置是否允许 WiFi 扫描(Android)\n * @param wifiScan true: 允许; false: 不允许\n */\n setWifiScan(wifiScan: boolean): void;\n\n /**\n * 设置是否 GPS 优先(Android)\n * @param gpsFirst true: GPS 优先; false: 网络优先\n */\n setGpsFirst(gpsFirst: boolean): void;\n\n /**\n * 设置是否等待 WiFi 列表刷新(Android)\n * @param onceLocationLatest true: 等待; false: 不等待\n */\n setOnceLocationLatest(onceLocationLatest: boolean): void;\n\n /**\n * 设置逆地理编码语言\n * @param language 语言代码,如 \"zh-CN\", \"en\"\n */\n setGeoLanguage(language: string): void;\n\n /**\n * 设置是否使用缓存策略(Android)\n * @param locationCacheEnable true: 使用缓存; false: 不使用\n */\n setLocationCacheEnable(locationCacheEnable: boolean): void;\n\n /**\n * 设置网络请求超时时间(Android)\n * @param httpTimeOut 超时时间,单位毫秒\n */\n setHttpTimeOut(httpTimeOut: number): void;\n\n /**\n * 设置期望的定位精度(iOS)\n * @param accuracy 精度级别:0-最佳, 1-10米, 2-100米, 3-1公里, 4-3公里\n */\n setDesiredAccuracy(accuracy: LocationAccuracy): void;\n\n /**\n * 设置定位超时时间(秒)\n * @param timeout 超时时间,单位秒,默认 10 秒\n */\n setLocationTimeout(timeout: number): void;\n\n /**\n * 设置逆地理编码超时时间(秒)\n * @param timeout 超时时间,单位秒,默认 5 秒\n */\n setReGeocodeTimeout(timeout: number): void;\n\n /**\n * 设置距离过滤器(米)(iOS)\n * 只有移动超过指定距离才会更新位置\n * @param distance 距离阈值,单位米\n */\n setDistanceFilter(distance: number): void;\n\n /**\n * 设置是否自动暂停位置更新(iOS)\n * @param pauses true: 自动暂停; false: 不暂停\n */\n setPausesLocationUpdatesAutomatically(pauses: boolean): void;\n\n /**\n * 设置是否允许后台定位(iOS)\n * @param allows true: 允许; false: 不允许\n */\n setAllowsBackgroundLocationUpdates(allows: boolean): void;\n\n /**\n * 设置定位协议\n * @param protocol 协议类型\n */\n setLocationProtocol(protocol: string): void;\n\n // ==================== 方向更新 (iOS) ====================\n\n /**\n * 开始更新设备方向(罗盘朝向)\n * 通过 onHeadingUpdate 事件接收方向更新\n * @platform ios\n */\n startUpdatingHeading(): void;\n\n /**\n * 停止更新设备方向\n * @platform ios\n */\n stopUpdatingHeading(): void;\n\n // ==================== 权限管理(增强版) ====================\n\n /**\n * 检查前台位置权限状态(增强版,支持 Android 14+ 适配)\n * @returns Promise<PermissionStatus> 详细的权限状态信息\n */\n checkLocationPermission(): Promise<PermissionStatus>;\n\n /**\n * 请求前台位置权限(增强版,支持 Android 14+ 适配)\n * @returns Promise<PermissionStatus> 请求后的权限状态\n */\n requestLocationPermission(): Promise<PermissionStatus>;\n\n /**\n * 请求后台位置权限(Android 10+、iOS)\n * 注意:必须在前台权限已授予后才能请求\n * @returns Promise<PermissionStatus> 请求后的权限状态\n */\n requestBackgroundLocationPermission(): Promise<PermissionStatus>;\n\n /**\n * 打开应用设置页面\n * 引导用户手动授予权限(当权限被永久拒绝时使用)\n */\n openAppSettings(): void;\n\n // ==================== 地图预加载 ====================\n\n /**\n * 开始预加载地图实例\n * 在后台预先初始化地图视图,提升首次显示速度,一般不用主动调用\n * @param config 预加载配置对象\n * @param config.poolSize 预加载的地图实例数量,默认 2\n */\n startMapPreload(config: { poolSize?: number }): void;\n\n /**\n * 获取预加载状态\n * @returns 预加载状态信息,包含池大小、是否正在预加载等,一般不用主动调用\n */\n getMapPreloadStatus(): {\n poolSize: number;\n isPreloading: boolean;\n maxPoolSize: number;\n };\n\n /**\n * 清空预加载池\n * 释放所有预加载的地图实例,一般不用主动调用\n */\n clearMapPreloadPool(): void;\n\n /**\n * 检查是否有可用的预加载实例\n * @returns 是否有可用的预加载地图实例,一般不用主动调用\n */\n hasPreloadedMapView(): boolean;\n\n /**\n * 检查原生 SDK 是否已配置 API Key\n * @returns 是否已配置\n */\n isNativeSDKConfigured(): boolean;\n\n // ==================== 便捷方法 ====================\n\n /**\n * 添加定位监听器(便捷方法)\n * 封装了 addListener,提供更简洁的 API\n * @param listener 定位回调函数\n * @returns 订阅对象,调用 remove() 取消监听\n */\n addLocationListener(listener: LocationListener): { remove: () => void };\n\n\n // ==================== 几何计算 ====================\n\n /**\n * 计算两个坐标点之间的距离\n * @param coordinate1 第一个坐标点\n * @param coordinate2 第二个坐标点\n * @returns 两点之间的距离(单位:米)\n */\n distanceBetweenCoordinates(coordinate1: LatLng,coordinate2: LatLng): Promise<number>;\n\n\n /**\n * 判断点是否在圆内\n * @param point 要判断的点\n * @param center 圆心坐标\n * @param radius 圆半径(单位:米)\n * @returns 是否在圆内\n */\n isPointInCircle(point: LatLng,center: LatLng,radius: number): Promise<boolean>;\n\n /**\n * 判断点是否在多边形内\n * @param point 要判断的点\n * @param polygon 多边形的顶点坐标数组\n * @returns 是否在多边形内\n */\n isPointInPolygon(point: LatLng,polygon: LatLng[]): Promise<boolean>;\n\n /**\n * 计算多边形面积\n * @param polygon 多边形的顶点坐标数组\n * @returns 面积(单位:平方米)\n */\n calculatePolygonArea(polygon: LatLng[]): Promise<number>;\n\n /**\n * 计算矩形面积\n * @param southWest 西南角坐标\n * @param northEast 东北角坐标\n * @returns 面积(单位:平方米)\n */\n calculateRectangleArea(southWest: LatLng,northEast: LatLng): Promise<number>;\n\n\n}\n\n// 获取原生模块实例 - 添加容错处理\nlet nativeModule: ExpoGaodeMapModule | null = null;\n\ntry {\n nativeModule = requireNativeModule<ExpoGaodeMapModule>('ExpoGaodeMap');\n} catch (error) {\n const moduleError = ErrorHandler.nativeModuleUnavailable();\n ErrorLogger.log(moduleError);\n}\n\n// 记录最近一次 initSDK 的配置(含 webKey)\nlet _sdkConfig: SDKConfig | null = null;\nlet _isSDKInitialized = false;\n\n// 扩展原生模块,添加便捷方法\nconst ExpoGaodeMapModuleWithHelpers = {\n ...(nativeModule || {}),\n\n /**\n * 初始化 SDK,并缓存配置(包含 webKey)\n * 注意:允许不提供任何 API Key,因为原生端可能已通过 Config Plugin 配置\n */\n initSDK(config: SDKConfig): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n\n // 检查是否有任何 key 被提供\n const hasJSKeys = !!(config.androidKey || config.iosKey);\n const hasWebKey = !!config.webKey;\n // 如果 JS 端没有提供 androidKey/iosKey,检查原生端是否已配置\n if (!hasJSKeys) {\n const isNativeConfigured = nativeModule.isNativeSDKConfigured();\n if (!isNativeConfigured && !hasWebKey){\n throw ErrorHandler.invalidApiKey('both');\n }\n // 如果原生已配置,或者只提供了 webKey,继续初始化\n ErrorLogger.warn(\n isNativeConfigured \n ? 'SDK 使用原生端配置的 API Key' \n : 'SDK 初始化仅使用 webKey',\n { config }\n );\n }\n _sdkConfig = config ?? null;\n nativeModule.initSDK(config);\n _isSDKInitialized = true;\n ErrorLogger.warn('SDK 初始化成功', { config });\n } catch (error: any) {\n _isSDKInitialized = false;\n throw ErrorHandler.wrapNativeError(error, 'SDK 初始化');\n }\n },\n\n /**\n * 检查 SDK 是否已通过 JS 调用 initSDK() 初始化\n * 注意:即使返回 false,原生端可能已通过 Config Plugin 自动初始化\n */\n isSDKInitialized(): boolean {\n return _isSDKInitialized;\n },\n\n /**\n * 开始连续定位\n * 注意:如果使用 Config Plugin 配置了 API Key,无需调用 initSDK()\n */\n start(): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n nativeModule.start();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '开始定位');\n }\n },\n\n /**\n * 停止定位\n */\n stop(): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n nativeModule.stop();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '停止定位');\n }\n },\n\n /**\n * 获取当前位置(单次定位)\n * 注意:如果使用 Config Plugin 配置了 API Key,无需调用 initSDK()\n */\n async getCurrentLocation(): Promise<Coordinates | ReGeocode> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.getCurrentLocation();\n } catch (error: any) {\n throw ErrorHandler.locationFailed(error?.message);\n }\n },\n\n /**\n * 检查位置权限状态\n */\n async checkLocationPermission(): Promise<PermissionStatus> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.checkLocationPermission();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '检查权限');\n }\n },\n\n /**\n * 请求前台位置权限(增强版)\n */\n async requestLocationPermission(): Promise<PermissionStatus> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n const result = await nativeModule.requestLocationPermission();\n if (!result.granted) {\n ErrorLogger.warn('前台位置权限未授予', result);\n }\n return result;\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '请求前台权限');\n }\n },\n\n /**\n * 请求后台位置权限\n * 注意:必须在前台权限已授予后才能请求\n */\n async requestBackgroundLocationPermission(): Promise<PermissionStatus> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n const result = await nativeModule.requestBackgroundLocationPermission();\n if (!result.granted) {\n ErrorLogger.warn('后台位置权限未授予', result);\n }\n return result;\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '请求后台权限');\n }\n },\n\n /**\n * 打开应用设置页面\n * 引导用户手动授予权限\n */\n openAppSettings(): void {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n nativeModule.openAppSettings();\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '打开设置');\n }\n },\n\n /**\n * 添加定位监听器(便捷方法)\n * 自动订阅 onLocationUpdate 事件,提供容错处理\n * @param listener 定位回调函数\n * @returns 订阅对象,调用 remove() 取消监听\n * 注意:如果使用 Config Plugin 配置了 API Key,无需调用 initSDK()\n */\n addLocationListener(listener: LocationListener): { remove: () => void } {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n if (!nativeModule?.addListener) {\n ErrorLogger.warn('Native module does not support events');\n }\n // 使用可选链和空值合并,确保即使模块不可用也不会崩溃\n return nativeModule?.addListener?.('onLocationUpdate', listener) || {\n remove: () => { },\n };\n },\n\n // ==================== 几何计算方法 ====================\n\n /**\n * 计算两个坐标点之间的距离\n * @param coordinate1 第一个坐标点\n * @param coordinate2 第二个坐标点\n * @returns 两点之间的距离(单位:米)\n */\n async distanceBetweenCoordinates(coordinate1: LatLng, coordinate2: LatLng): Promise<number> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.distanceBetweenCoordinates(coordinate1, coordinate2);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '计算距离');\n }\n },\n\n /**\n * 判断点是否在圆内\n * @param point 要判断的点\n * @param center 圆心坐标\n * @param radius 圆半径(单位:米)\n * @returns 是否在圆内\n */\n async isPointInCircle(point: LatLng, center: LatLng, radius: number): Promise<boolean> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.isPointInCircle(point, center, radius);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在圆内');\n }\n },\n\n /**\n * 判断点是否在多边形内\n * @param point 要判断的点\n * @param polygon 多边形的顶点坐标数组\n * @returns 是否在多边形内\n */\n async isPointInPolygon(point: LatLng, polygon: LatLng[]): Promise<boolean> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.isPointInPolygon(point, polygon);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在多边形内');\n }\n },\n\n /**\n * 计算多边形面积\n * @param polygon 多边形的顶点坐标数组\n * @returns 面积(单位:平方米)\n */\n async calculatePolygonArea(polygon: LatLng[]): Promise<number> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.calculatePolygonArea(polygon);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '计算多边形面积');\n }\n },\n\n /**\n * 计算矩形面积\n * @param southWest 西南角坐标\n * @param northEast 东北角坐标\n * @returns 面积(单位:平方米)\n */\n async calculateRectangleArea(southWest: LatLng, northEast: LatLng): Promise<number> {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return await nativeModule.calculateRectangleArea(southWest, northEast);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, '计算矩形面积');\n }\n },\n};\n\n/**\n* 获取最近一次 initSDK 的配置\n*/\nexport function getSDKConfig(): SDKConfig | null {\n return _sdkConfig;\n}\n\n/**\n* 获取用于 Web API 的 webKey(若未初始化或未提供则返回 undefined)\n*/\nexport function getWebKey(): string | undefined {\n return _sdkConfig?.webKey;\n}\n\nexport default ExpoGaodeMapModuleWithHelpers as unknown as ExpoGaodeMapModule;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapView.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAKX,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapView.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAKX,MAAM,SAAS,CAAC;AAMjB,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,gBAAgB,iFA4EpB,CAAC;AAIH,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { requireNativeViewManager } from 'expo-modules-core';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { ErrorHandler } from './utils/ErrorHandler';
|
|
4
|
+
import { MapContext } from './components/MapContext';
|
|
5
|
+
import { MapUI } from './components/MapUI';
|
|
6
|
+
import { View, StyleSheet } from 'react-native';
|
|
4
7
|
const NativeView = requireNativeViewManager('ExpoGaodeMapView');
|
|
5
8
|
/**
|
|
6
9
|
* 高德地图视图组件,提供地图操作API和覆盖物管理功能
|
|
@@ -63,9 +66,26 @@ const ExpoGaodeMapView = React.forwardRef((props, ref) => {
|
|
|
63
66
|
* @returns 返回地图API的引用对象,可用于调用地图相关方法
|
|
64
67
|
*/
|
|
65
68
|
React.useImperativeHandle(ref, () => apiRef, [apiRef]);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
// 分离 children:区分原生覆盖物和普通 UI 组件
|
|
70
|
+
const { children, style, ...otherProps } = props;
|
|
71
|
+
const overlays = [];
|
|
72
|
+
const uiControls = [];
|
|
73
|
+
React.Children.forEach(children, (child) => {
|
|
74
|
+
if (React.isValidElement(child) && (child.type === MapUI || child.type?.isMapUI)) {
|
|
75
|
+
uiControls.push(child);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
overlays.push(child);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return (<MapContext.Provider value={apiRef}>
|
|
82
|
+
<View style={[{ flex: 1, position: 'relative', overflow: 'hidden' }, style]}>
|
|
83
|
+
<NativeView ref={nativeRef} style={StyleSheet.absoluteFill} {...otherProps}>
|
|
84
|
+
{overlays}
|
|
85
|
+
</NativeView>
|
|
86
|
+
{uiControls}
|
|
87
|
+
</View>
|
|
88
|
+
</MapContext.Provider>);
|
|
69
89
|
});
|
|
70
90
|
ExpoGaodeMapView.displayName = 'ExpoGaodeMapView';
|
|
71
91
|
export default ExpoGaodeMapView;
|
|
@@ -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;AAU/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
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';\n\nimport type {\n MapViewProps,\n MapViewRef,\n CameraPosition,\n LatLng,\n Point,\n\n} from './types';\nimport { ErrorHandler } from './utils/ErrorHandler';\nimport { MapContext } from './components/MapContext';\nimport { MapUI } from './components/MapUI';\nimport { View, StyleSheet } from 'react-native';\n\nexport type { MapViewRef } from './types';\n\nconst NativeView: React.ComponentType<MapViewProps & { ref?: React.Ref<MapViewRef> }> = requireNativeViewManager('ExpoGaodeMapView');\n\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<MapViewRef>(null);\n const internalRef = React.useRef<MapViewRef | null>(null);\n \n /**\n * 🔑 性能优化:通用 API 方法包装器\n * 统一处理初始化检查和错误处理,减少重复代码\n */\n const createApiMethod = React.useCallback(<T extends (...args: any[]) => any>(\n methodName: keyof MapViewRef\n ) => {\n return ((...args: Parameters<T>) => {\n if (!nativeRef.current) {\n throw ErrorHandler.mapViewNotInitialized(methodName as string);\n }\n try {\n return (nativeRef.current[methodName] as T)(...args);\n } catch (error: any) {\n throw ErrorHandler.wrapNativeError(error, methodName as string);\n }\n }) as T;\n }, []);\n\n /**\n * 使用通用包装器创建所有 API 方法\n * 所有方法共享相同的错误处理逻辑\n */\n const apiRef: MapViewRef = React.useMemo(() => ({\n moveCamera: createApiMethod<(position: CameraPosition, duration?: number) => Promise<void>>('moveCamera'),\n getLatLng: createApiMethod<(point: Point) => Promise<LatLng>>('getLatLng'),\n setCenter: createApiMethod<(center: LatLng, animated?: boolean) => Promise<void>>('setCenter'),\n setZoom: createApiMethod<(zoom: number, animated?: boolean) => Promise<void>>('setZoom'),\n getCameraPosition: createApiMethod<() => Promise<CameraPosition>>('getCameraPosition'),\n }), [createApiMethod]);\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 // 分离 children:区分原生覆盖物和普通 UI 组件\n const { children, style, ...otherProps } = props;\n const overlays: React.ReactNode[] = [];\n const uiControls: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && (child.type === MapUI || (child.type as any)?.isMapUI)) {\n uiControls.push(child);\n } else {\n overlays.push(child);\n }\n });\n\n return (\n <MapContext.Provider value={apiRef}>\n <View style={[{ flex: 1, position: 'relative', overflow: 'hidden' }, style]}>\n <NativeView\n ref={nativeRef}\n style={StyleSheet.absoluteFill}\n {...otherProps}\n >\n {overlays}\n </NativeView>\n {uiControls}\n </View>\n </MapContext.Provider>\n );\n});\n\nExpoGaodeMapView.displayName = 'ExpoGaodeMapView';\n\nexport default ExpoGaodeMapView;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FoldableMapView.d.ts","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,OAAO,EAAoB,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe;IACf,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACvE,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,cAAc;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"FoldableMapView.d.ts","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,OAAO,EAAoB,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe;IACf,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACvE,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,cAAc;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwI1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAC5B,MAAM,CAAC,EAAE,cAAc;;;;EAkExB"}
|
|
@@ -99,7 +99,7 @@ export const FoldableMapView = ({ foldableConfig, ...mapProps }) => {
|
|
|
99
99
|
}
|
|
100
100
|
catch (error) {
|
|
101
101
|
if (config.debug) {
|
|
102
|
-
console.error('[FoldableMapView] 处理折叠状态变化失败:'
|
|
102
|
+
console.error('[FoldableMapView] 处理折叠状态变化失败:');
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
};
|
|
@@ -145,7 +145,7 @@ export function useFoldableMap(mapRef, config) {
|
|
|
145
145
|
}
|
|
146
146
|
catch (error) {
|
|
147
147
|
if (mergedConfig.debug) {
|
|
148
|
-
console.error('[useFoldableMap] 调整失败:'
|
|
148
|
+
console.error('[useFoldableMap] 调整失败:');
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FoldableMapView.js","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport ExpoGaodeMapView from '../ExpoGaodeMapView';\n\nimport { PlatformDetector, DeviceInfo, FoldState } from '../utils/PlatformDetector';\nimport { MapViewProps } from '../types';\n\n/**\n * 折叠屏适配配置\n */\nexport interface FoldableConfig {\n /** 折叠时是否自动调整缩放级别 */\n autoAdjustZoom?: boolean;\n /** 展开时的缩放级别增量 */\n unfoldedZoomDelta?: number;\n /** 是否在折叠/展开时保持中心点 */\n keepCenterOnFold?: boolean;\n /** 折叠状态变化回调 */\n onFoldStateChange?: (state: FoldState, deviceInfo: DeviceInfo) => void;\n /** 是否启用调试日志 */\n debug?: boolean;\n}\n\n/**\n * 折叠屏地图视图组件\n * \n * 自动适配折叠屏设备的展开/折叠状态变化\n */\nexport interface FoldableMapViewProps extends MapViewProps {\n /** 折叠屏适配配置 */\n foldableConfig?: FoldableConfig;\n}\n\nexport const FoldableMapView: React.FC<FoldableMapViewProps> = ({\n foldableConfig,\n ...mapProps\n}) => {\n const mapRef = useRef<any>(null);\n const [currentFoldState, setCurrentFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n\n const config: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n ...foldableConfig,\n };\n\n useEffect(() => {\n // 仅在 Android 折叠屏设备上启用\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n if (config.debug) {\n console.log('[FoldableMapView] 非折叠屏设备,跳过适配');\n }\n return;\n }\n\n if (config.debug) {\n console.log('[FoldableMapView] 初始化折叠屏适配');\n console.log('设备信息:', deviceInfo);\n console.log('初始折叠状态:', currentFoldState);\n }\n\n // 监听屏幕尺寸变化\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n \n if (config.debug) {\n console.log('[FoldableMapView] 屏幕尺寸变化');\n console.log('新设备信息:', newInfo);\n console.log('新折叠状态:', newFoldState);\n }\n\n // 折叠状态变化时的处理\n if (newFoldState !== currentFoldState && currentFoldState !== FoldState.UNKNOWN) {\n await handleFoldStateChange(currentFoldState, newFoldState, newInfo);\n }\n\n setCurrentFoldState(newFoldState);\n setDeviceInfo(newInfo);\n \n // 触发回调\n config.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n // 设置初始状态\n const initialState = PlatformDetector.getFoldState();\n setCurrentFoldState(initialState);\n\n return () => {\n removeListener();\n };\n }, []);\n\n /**\n * 处理折叠状态变化\n */\n const handleFoldStateChange = async (\n oldState: FoldState,\n newState: FoldState,\n newInfo: DeviceInfo\n ) => {\n if (!mapRef.current) {\n return;\n }\n\n try {\n // 获取当前地图状态\n const currentCamera = await mapRef.current.getCameraPosition?.();\n \n if (!currentCamera) {\n if (config.debug) {\n console.warn('[FoldableMapView] 无法获取相机位置');\n }\n return;\n }\n\n const isUnfolding = newState === FoldState.UNFOLDED && oldState === FoldState.FOLDED;\n const isFolding = newState === FoldState.FOLDED && oldState === FoldState.UNFOLDED;\n\n if (config.debug) {\n console.log('[FoldableMapView] 折叠状态变化:', {\n oldState,\n newState,\n isUnfolding,\n isFolding,\n currentZoom: currentCamera.zoom,\n });\n }\n\n // 展开时增加缩放级别,折叠时减少\n if (config.autoAdjustZoom && (isUnfolding || isFolding)) {\n const zoomDelta = isUnfolding ? config.unfoldedZoomDelta : -config.unfoldedZoomDelta;\n const newZoom = Math.max(3, Math.min(20, currentCamera.zoom + zoomDelta));\n\n if (config.debug) {\n console.log('[FoldableMapView] 调整缩放:', {\n oldZoom: currentCamera.zoom,\n newZoom,\n delta: zoomDelta,\n });\n }\n\n // 保持中心点,只调整缩放\n await mapRef.current.animateToCamera?.({\n center: config.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: newZoom,\n duration: 300,\n });\n }\n } catch (error) {\n if (config.debug) {\n console.error('[FoldableMapView] 处理折叠状态变化失败:', error);\n }\n }\n };\n\n return (\n <ExpoGaodeMapView\n ref={mapRef}\n {...mapProps}\n />\n );\n};\n\n/**\n * 折叠屏适配 Hook\n * \n * 用于在现有地图组件中添加折叠屏适配功能\n */\nexport function useFoldableMap(\n mapRef: React.RefObject<any>,\n config?: FoldableConfig\n) {\n const [foldState, setFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n\n const mergedConfig: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n ...config,\n };\n\n useEffect(() => {\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n return;\n }\n\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n \n if (newFoldState !== foldState && foldState !== FoldState.UNKNOWN) {\n // 处理折叠状态变化\n if (mapRef.current && mergedConfig.autoAdjustZoom) {\n try {\n const currentCamera = await mapRef.current.getCameraPosition?.();\n if (currentCamera) {\n const isUnfolding = newFoldState === FoldState.UNFOLDED && foldState === FoldState.FOLDED;\n const zoomDelta = isUnfolding ? mergedConfig.unfoldedZoomDelta : -mergedConfig.unfoldedZoomDelta;\n const newZoom = Math.max(3, Math.min(20, currentCamera.zoom + zoomDelta));\n\n await mapRef.current.animateToCamera?.({\n center: mergedConfig.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: newZoom,\n duration: 300,\n });\n }\n } catch (error) {\n if (mergedConfig.debug) {\n console.error('[useFoldableMap] 调整失败:', error);\n }\n }\n }\n }\n\n setFoldState(newFoldState);\n setDeviceInfo(newInfo);\n mergedConfig.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n const initialState = PlatformDetector.getFoldState();\n setFoldState(initialState);\n\n return () => {\n removeListener();\n };\n }, [foldState, deviceInfo.isFoldable]);\n\n return {\n foldState,\n deviceInfo,\n isFoldable: deviceInfo.isFoldable,\n };\n}"]}
|
|
1
|
+
{"version":3,"file":"FoldableMapView.js","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAc,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA6BpF,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC9D,cAAc,EACd,GAAG,QAAQ,EACZ,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,CAAM,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,OAAO,CAAC,CAAC;IACvF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3F,MAAM,MAAM,GAA6B;QACvC,cAAc,EAAE,IAAI;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC3B,KAAK,EAAE,KAAK;QACZ,GAAG,cAAc;KAClB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,sBAAsB;QACtB,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACxD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC3C,CAAC;QAED,WAAW;QACX,MAAM,cAAc,GAAG,gBAAgB,CAAC,0BAA0B,CAChE,KAAK,EAAE,OAAmB,EAAE,EAAE;YAC5B,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAErD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;YAED,aAAa;YACb,IAAI,YAAY,KAAK,gBAAgB,IAAI,gBAAgB,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAChF,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YACvE,CAAC;YAED,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEvB,OAAO;YACP,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC,CACF,CAAC;QAEF,SAAS;QACT,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAElC,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,qBAAqB,GAAG,KAAK,EACjC,QAAmB,EACnB,QAAmB,EACnB,OAAmB,EACnB,EAAE;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,WAAW;YACX,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAEjE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC7C,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,MAAM,CAAC;YACrF,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAC,MAAM,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC;YAEnF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE;oBACvC,QAAQ;oBACR,QAAQ;oBACR,WAAW;oBACX,SAAS;oBACT,WAAW,EAAE,aAAa,CAAC,IAAI;iBAChC,CAAC,CAAC;YACL,CAAC;YAED,kBAAkB;YAClB,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;gBACxD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACrF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;gBAE1E,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE;wBACrC,OAAO,EAAE,aAAa,CAAC,IAAI;wBAC3B,OAAO;wBACP,KAAK,EAAE,SAAS;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,cAAc;gBACd,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;oBACrC,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;oBAClE,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAIF,OAAO,CACL,CAAC,gBAAgB,CACf,GAAG,CAAC,CAAC,MAAM,CAAC,CACZ,IAAI,QAAQ,CAAC,EACb,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA4B,EAC5B,MAAuB;IAEvB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3F,MAAM,YAAY,GAA6B;QAC7C,cAAc,EAAE,IAAI;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC3B,KAAK,EAAE,KAAK;QACZ,GAAG,MAAM;KACV,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,0BAA0B,CAChE,KAAK,EAAE,OAAmB,EAAE,EAAE;YAC5B,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAErD,IAAI,YAAY,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAClE,WAAW;gBACX,IAAI,MAAM,CAAC,OAAO,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;oBAClD,IAAI,CAAC;wBACH,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;wBACjE,IAAI,aAAa,EAAE,CAAC;4BAClB,MAAM,WAAW,GAAG,YAAY,KAAK,SAAS,CAAC,QAAQ,IAAI,SAAS,KAAK,SAAS,CAAC,MAAM,CAAC;4BAC1F,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC;4BACjG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;4BAE1E,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gCACrC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gCACxE,IAAI,EAAE,OAAO;gCACb,QAAQ,EAAE,GAAG;6BACd,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;4BACvB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;wBAC1C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,YAAY,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC,CACF,CAAC;QAEF,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,YAAY,CAAC,YAAY,CAAC,CAAC;QAE3B,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvC,OAAO;QACL,SAAS;QACT,UAAU;QACV,UAAU,EAAE,UAAU,CAAC,UAAU;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport ExpoGaodeMapView from '../ExpoGaodeMapView';\n\nimport { PlatformDetector, DeviceInfo, FoldState } from '../utils/PlatformDetector';\nimport { MapViewProps } from '../types';\n\n/**\n * 折叠屏适配配置\n */\nexport interface FoldableConfig {\n /** 折叠时是否自动调整缩放级别 */\n autoAdjustZoom?: boolean;\n /** 展开时的缩放级别增量 */\n unfoldedZoomDelta?: number;\n /** 是否在折叠/展开时保持中心点 */\n keepCenterOnFold?: boolean;\n /** 折叠状态变化回调 */\n onFoldStateChange?: (state: FoldState, deviceInfo: DeviceInfo) => void;\n /** 是否启用调试日志 */\n debug?: boolean;\n}\n\n/**\n * 折叠屏地图视图组件\n * \n * 自动适配折叠屏设备的展开/折叠状态变化\n */\nexport interface FoldableMapViewProps extends MapViewProps {\n /** 折叠屏适配配置 */\n foldableConfig?: FoldableConfig;\n}\n\nexport const FoldableMapView: React.FC<FoldableMapViewProps> = ({\n foldableConfig,\n ...mapProps\n}) => {\n const mapRef = useRef<any>(null);\n const [currentFoldState, setCurrentFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n\n const config: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n ...foldableConfig,\n };\n\n useEffect(() => {\n // 仅在 Android 折叠屏设备上启用\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n if (config.debug) {\n console.log('[FoldableMapView] 非折叠屏设备,跳过适配');\n }\n return;\n }\n\n if (config.debug) {\n console.log('[FoldableMapView] 初始化折叠屏适配');\n console.log('设备信息:', deviceInfo);\n console.log('初始折叠状态:', currentFoldState);\n }\n\n // 监听屏幕尺寸变化\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n \n if (config.debug) {\n console.log('[FoldableMapView] 屏幕尺寸变化');\n console.log('新设备信息:', newInfo);\n console.log('新折叠状态:', newFoldState);\n }\n\n // 折叠状态变化时的处理\n if (newFoldState !== currentFoldState && currentFoldState !== FoldState.UNKNOWN) {\n await handleFoldStateChange(currentFoldState, newFoldState, newInfo);\n }\n\n setCurrentFoldState(newFoldState);\n setDeviceInfo(newInfo);\n \n // 触发回调\n config.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n // 设置初始状态\n const initialState = PlatformDetector.getFoldState();\n setCurrentFoldState(initialState);\n\n return () => {\n removeListener();\n };\n }, []);\n\n /**\n * 处理折叠状态变化\n */\n const handleFoldStateChange = async (\n oldState: FoldState,\n newState: FoldState,\n newInfo: DeviceInfo\n ) => {\n if (!mapRef.current) {\n return;\n }\n\n try {\n // 获取当前地图状态\n const currentCamera = await mapRef.current.getCameraPosition?.();\n \n if (!currentCamera) {\n if (config.debug) {\n console.warn('[FoldableMapView] 无法获取相机位置');\n }\n return;\n }\n\n const isUnfolding = newState === FoldState.UNFOLDED && oldState === FoldState.FOLDED;\n const isFolding = newState === FoldState.FOLDED && oldState === FoldState.UNFOLDED;\n\n if (config.debug) {\n console.log('[FoldableMapView] 折叠状态变化:', {\n oldState,\n newState,\n isUnfolding,\n isFolding,\n currentZoom: currentCamera.zoom,\n });\n }\n\n // 展开时增加缩放级别,折叠时减少\n if (config.autoAdjustZoom && (isUnfolding || isFolding)) {\n const zoomDelta = isUnfolding ? config.unfoldedZoomDelta : -config.unfoldedZoomDelta;\n const newZoom = Math.max(3, Math.min(20, currentCamera.zoom + zoomDelta));\n\n if (config.debug) {\n console.log('[FoldableMapView] 调整缩放:', {\n oldZoom: currentCamera.zoom,\n newZoom,\n delta: zoomDelta,\n });\n }\n\n // 保持中心点,只调整缩放\n await mapRef.current.animateToCamera?.({\n center: config.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: newZoom,\n duration: 300,\n });\n }\n } catch (error) {\n if (config.debug) {\n console.error('[FoldableMapView] 处理折叠状态变化失败:');\n }\n }\n };\n\n \n\n return (\n <ExpoGaodeMapView\n ref={mapRef}\n {...mapProps}\n />\n );\n};\n\n/**\n * 折叠屏适配 Hook\n * \n * 用于在现有地图组件中添加折叠屏适配功能\n */\nexport function useFoldableMap(\n mapRef: React.RefObject<any>,\n config?: FoldableConfig\n) {\n const [foldState, setFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n\n const mergedConfig: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n ...config,\n };\n\n useEffect(() => {\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n return;\n }\n\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n \n if (newFoldState !== foldState && foldState !== FoldState.UNKNOWN) {\n // 处理折叠状态变化\n if (mapRef.current && mergedConfig.autoAdjustZoom) {\n try {\n const currentCamera = await mapRef.current.getCameraPosition?.();\n if (currentCamera) {\n const isUnfolding = newFoldState === FoldState.UNFOLDED && foldState === FoldState.FOLDED;\n const zoomDelta = isUnfolding ? mergedConfig.unfoldedZoomDelta : -mergedConfig.unfoldedZoomDelta;\n const newZoom = Math.max(3, Math.min(20, currentCamera.zoom + zoomDelta));\n\n await mapRef.current.animateToCamera?.({\n center: mergedConfig.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: newZoom,\n duration: 300,\n });\n }\n } catch (error) {\n if (mergedConfig.debug) {\n console.error('[useFoldableMap] 调整失败:');\n }\n }\n }\n }\n\n setFoldState(newFoldState);\n setDeviceInfo(newInfo);\n mergedConfig.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n const initialState = PlatformDetector.getFoldState();\n setFoldState(initialState);\n\n return () => {\n removeListener();\n };\n }, [foldState, deviceInfo.isFoldable]);\n\n return {\n foldState,\n deviceInfo,\n isFoldable: deviceInfo.isFoldable,\n };\n}"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { MapViewRef } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* 地图上下文
|
|
5
|
+
* 用于在子组件中访问地图实例的方法
|
|
6
|
+
*/
|
|
7
|
+
export declare const MapContext: React.Context<MapViewRef | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Hook: 获取地图实例引用
|
|
10
|
+
* 只能在 ExpoGaodeMapView 的子组件中使用
|
|
11
|
+
*/
|
|
12
|
+
export declare function useMap(): MapViewRef;
|
|
13
|
+
//# sourceMappingURL=MapContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapContext.d.ts","sourceRoot":"","sources":["../../src/components/MapContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,UAAU,kCAA+C,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,MAAM,IAAI,UAAU,CAMnC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 地图上下文
|
|
4
|
+
* 用于在子组件中访问地图实例的方法
|
|
5
|
+
*/
|
|
6
|
+
export const MapContext = React.createContext(null);
|
|
7
|
+
/**
|
|
8
|
+
* Hook: 获取地图实例引用
|
|
9
|
+
* 只能在 ExpoGaodeMapView 的子组件中使用
|
|
10
|
+
*/
|
|
11
|
+
export function useMap() {
|
|
12
|
+
const context = React.useContext(MapContext);
|
|
13
|
+
if (!context) {
|
|
14
|
+
throw new Error('useMap must be used within a ExpoGaodeMapView component');
|
|
15
|
+
}
|
|
16
|
+
return context;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=MapContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapContext.js","sourceRoot":"","sources":["../../src/components/MapContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAoB,IAAI,CAAC,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import * as React from 'react';\nimport type { MapViewRef } from '../types';\n\n/**\n * 地图上下文\n * 用于在子组件中访问地图实例的方法\n */\nexport const MapContext = React.createContext<MapViewRef | null>(null);\n\n/**\n * Hook: 获取地图实例引用\n * 只能在 ExpoGaodeMapView 的子组件中使用\n */\nexport function useMap(): MapViewRef {\n const context = React.useContext(MapContext);\n if (!context) {\n throw new Error('useMap must be used within a ExpoGaodeMapView component');\n }\n return context;\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* MapUI 组件
|
|
4
|
+
* 用于包裹不需要作为地图原生子组件(如 Marker)的普通 React 组件。
|
|
5
|
+
* 被此组件包裹的内容将渲染在地图视图的上方(兄弟节点),而不是内部。
|
|
6
|
+
* 这解决了在地图内部放置普通 View 导致的触摸事件冲突问题。
|
|
7
|
+
*
|
|
8
|
+
* 示例:
|
|
9
|
+
* <MapView>
|
|
10
|
+
* <Marker ... />
|
|
11
|
+
* <MapUI>
|
|
12
|
+
* <View style={{ position: 'absolute', ... }}>
|
|
13
|
+
* <Text>悬浮层</Text>
|
|
14
|
+
* </View>
|
|
15
|
+
* </MapUI>
|
|
16
|
+
* </MapView>
|
|
17
|
+
*/
|
|
18
|
+
export declare const MapUI: React.FC<React.PropsWithChildren<{}>>;
|
|
19
|
+
//# sourceMappingURL=MapUI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapUI.d.ts","sourceRoot":"","sources":["../../src/components/MapUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAEvD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* MapUI 组件
|
|
4
|
+
* 用于包裹不需要作为地图原生子组件(如 Marker)的普通 React 组件。
|
|
5
|
+
* 被此组件包裹的内容将渲染在地图视图的上方(兄弟节点),而不是内部。
|
|
6
|
+
* 这解决了在地图内部放置普通 View 导致的触摸事件冲突问题。
|
|
7
|
+
*
|
|
8
|
+
* 示例:
|
|
9
|
+
* <MapView>
|
|
10
|
+
* <Marker ... />
|
|
11
|
+
* <MapUI>
|
|
12
|
+
* <View style={{ position: 'absolute', ... }}>
|
|
13
|
+
* <Text>悬浮层</Text>
|
|
14
|
+
* </View>
|
|
15
|
+
* </MapUI>
|
|
16
|
+
* </MapView>
|
|
17
|
+
*/
|
|
18
|
+
export const MapUI = ({ children }) => {
|
|
19
|
+
return <>{children}</>;
|
|
20
|
+
};
|
|
21
|
+
// 静态标志,用于识别
|
|
22
|
+
MapUI.isMapUI = true;
|
|
23
|
+
//# sourceMappingURL=MapUI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapUI.js","sourceRoot":"","sources":["../../src/components/MapUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,KAAK,GAA0C,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3E,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;AACzB,CAAC,CAAC;AAEF,YAAY;AACX,KAAa,CAAC,OAAO,GAAG,IAAI,CAAC","sourcesContent":["import React from 'react';\n\n/**\n * MapUI 组件\n * 用于包裹不需要作为地图原生子组件(如 Marker)的普通 React 组件。\n * 被此组件包裹的内容将渲染在地图视图的上方(兄弟节点),而不是内部。\n * 这解决了在地图内部放置普通 View 导致的触摸事件冲突问题。\n * \n * 示例:\n * <MapView>\n * <Marker ... />\n * <MapUI>\n * <View style={{ position: 'absolute', ... }}>\n * <Text>悬浮层</Text>\n * </View>\n * </MapUI>\n * </MapView>\n */\nexport const MapUI: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {\n return <>{children}</>;\n};\n\n// 静态标志,用于识别\n(MapUI as any).isMapUI = true;\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export * from './types';
|
|
|
2
2
|
export { default as ExpoGaodeMapModule } from './ExpoGaodeMapModule';
|
|
3
3
|
export { default as MapView } from './ExpoGaodeMapView';
|
|
4
4
|
export type { MapViewRef } from './ExpoGaodeMapView';
|
|
5
|
+
export { useMap } from './components/MapContext';
|
|
6
|
+
export { MapUI } from './components/MapUI';
|
|
5
7
|
export { Marker, Polyline, Polygon, Circle, HeatMap, MultiPoint, Cluster, } from './components/overlays';
|
|
6
8
|
export { requireModule, OptionalModules, getInstalledModules, printModuleInfo, createLazyLoader, } from './utils/ModuleLoader';
|
|
7
9
|
export { ErrorHandler, ErrorLogger, GaodeMapError, ErrorType, } from './utils/ErrorHandler';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,OAAO,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,MAAM,GACP,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EACL,eAAe,EACf,iBAAiB,EAAE,UAAU;AAC7B,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,eAAe,EACf,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,oBAAoB,EACpB,cAAc,GACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEjF,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAM/B;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,wOAGjC,CAAA;AAGF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -6,6 +6,8 @@ export * from './types';
|
|
|
6
6
|
export { default as ExpoGaodeMapModule } from './ExpoGaodeMapModule';
|
|
7
7
|
// 导出地图视图组件
|
|
8
8
|
export { default as MapView } from './ExpoGaodeMapView';
|
|
9
|
+
export { useMap } from './components/MapContext';
|
|
10
|
+
export { MapUI } from './components/MapUI';
|
|
9
11
|
// 导出覆盖物组件
|
|
10
12
|
export { Marker, Polyline, Polygon, Circle, HeatMap, MultiPoint, Cluster, } from './components/overlays';
|
|
11
13
|
// 导出模块检测工具
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,6BAA6B,MAAM,sBAAsB,CAAC;AAGjE,mBAAmB;AACnB,cAAc,SAAS,CAAC;AACxB,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAErE,WAAW;AACX,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,6BAA6B,MAAM,sBAAsB,CAAC;AAGjE,mBAAmB;AACnB,cAAc,SAAS,CAAC;AACxB,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAErE,WAAW;AACX,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,UAAU;AACV,OAAO,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,MAAM,uBAAuB,CAAC;AAE/B,WAAW;AACX,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,WAAW;AACX,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,sBAAsB,CAAC;AAG9B,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,MAAM,GACP,MAAM,0BAA0B,CAAC;AAGlC,gDAAgD;AAChD,OAAO,EACL,eAAe,EACf,iBAAiB,EAAE,UAAU;AAC7B,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,YAAY;AACZ,OAAO,EACL,eAAe,EACf,cAAc,GACf,MAAM,8BAA8B,CAAC;AAMtC,aAAa;AACb,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAejF,MAAM,uBAAuB,GAAG,6BAA6B,CAAC,yBAAyB,CAAA;AACvF,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,uBAAuB,CAAA;AAGjF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;IACzD,SAAS,EAAE,mBAAmB;IAC9B,aAAa,EAAE,uBAAuB;CACvC,CAAC,CAAA;AAEF,yBAAyB;AACzB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE/D,WAAW;AACX,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["\nimport { createPermissionHook } from 'expo-modules-core';\nimport ExpoGaodeMapModuleWithHelpers from './ExpoGaodeMapModule';\n\n\n// 导出类型定义(包含所有通用类型)\nexport * from './types';\n// 导出原生模块\nexport { default as ExpoGaodeMapModule } from './ExpoGaodeMapModule';\n\n// 导出地图视图组件\nexport { default as MapView } from './ExpoGaodeMapView';\nexport type { MapViewRef } from './ExpoGaodeMapView';\nexport { useMap } from './components/MapContext';\nexport { MapUI } from './components/MapUI';\n\n// 导出覆盖物组件\nexport {\n Marker,\n Polyline,\n Polygon,\n Circle,\n HeatMap,\n MultiPoint,\n Cluster,\n} from './components/overlays';\n\n// 导出模块检测工具\nexport {\n requireModule,\n OptionalModules,\n getInstalledModules,\n printModuleInfo,\n createLazyLoader,\n} from './utils/ModuleLoader';\n\n// 导出错误处理工具\nexport {\n ErrorHandler,\n ErrorLogger,\n GaodeMapError,\n ErrorType,\n} from './utils/ErrorHandler';\nexport type { ErrorDetails } from './utils/ErrorHandler';\n\n// 导出平台检测工具\nexport {\n PlatformDetector,\n DeviceType,\n FoldState,\n isAndroid14Plus,\n isiOS17Plus,\n isTablet,\n isFoldable,\n isIPad,\n} from './utils/PlatformDetector';\nexport type { DeviceInfo, SystemVersion } from './utils/PlatformDetector';\n\n// 导出权限工具类(仅提供文案和诊断,实际权限请求使用 ExpoGaodeMapModule)\nexport {\n PermissionUtils,\n PermissionManager, // 向后兼容的别名\n LocationPermissionType,\n} from './utils/PermissionUtils';\n\n// 导出折叠屏适配组件\nexport {\n FoldableMapView,\n useFoldableMap,\n} from './components/FoldableMapView';\nexport type {\n FoldableMapViewProps,\n FoldableConfig,\n} from './components/FoldableMapView';\n\n// 导出离线地图 API\nexport { default as ExpoGaodeMapOfflineModule } from './utils/OfflineMapManager';\n\nexport type {\n OfflineMapInfo,\n OfflineMapStatus,\n OfflineMapDownloadConfig,\n OfflineMapDownloadEvent,\n OfflineMapCompleteEvent,\n OfflineMapErrorEvent,\n OfflineMapPausedEvent,\n OfflineMapCancelledEvent,\n OfflineMapStorageInfo,\n OfflineMapEvents,\n} from './types/offline.types';\n\nconst requestPermissionsAsync = ExpoGaodeMapModuleWithHelpers.requestLocationPermission\nconst getPermissionsAsync = ExpoGaodeMapModuleWithHelpers.checkLocationPermission\n\n\n/**\n * Check or request permissions to access the location.\n * This uses both `requestPermissionsAsync` and `getPermissionsAsync` to interact with the permissions.\n *\n * @example\n * ```ts\n * const [status, requestPermission] = useLocationPermissions();\n * ```\n */\nexport const useLocationPermissions = createPermissionHook({\n getMethod: getPermissionsAsync,\n requestMethod: requestPermissionsAsync,\n})\n\n// 导出便捷读取的 SDK 配置与 webKey\nexport { getSDKConfig, getWebKey } from './ExpoGaodeMapModule';\n\n// 默认导出原生模块\nexport { default } from './ExpoGaodeMapModule';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModuleLoader.js","sourceRoot":"","sources":["../../src/utils/ModuleLoader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,uBAAuB;IAC/B,UAAU,EAAE,2BAA2B;IACvC,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,yBAAyB;CAC3B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,WAAmB;IACnE,OAAO,CAAC,IAAI,CACV,uBAAuB,WAAW,SAAS,UAAU,KAAK;QAC1D,oBAAoB,UAAU,IAAI;QAClC,8BAA8B,UAAU,QAAQ,CACjD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,IAAI,CACV,oDAAoD;QACpD,6BAA6B,CAC9B,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,gBAAgB,CAAI,MAAe;IACjD,IAAI,MAAM,GAAa,IAAI,CAAC;IAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,
|
|
1
|
+
{"version":3,"file":"ModuleLoader.js","sourceRoot":"","sources":["../../src/utils/ModuleLoader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,uBAAuB;IAC/B,UAAU,EAAE,2BAA2B;IACvC,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,yBAAyB;CAC3B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,WAAmB;IACnE,OAAO,CAAC,IAAI,CACV,uBAAuB,WAAW,SAAS,UAAU,KAAK;QAC1D,oBAAoB,UAAU,IAAI;QAClC,8BAA8B,UAAU,QAAQ,CACjD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,IAAI,CACV,oDAAoD;QACpD,6BAA6B,CAC9B,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,gBAAgB,CAAI,MAAe;IACjD,IAAI,MAAM,GAAa,IAAI,CAAC;IAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACzC,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * 模块检测器 - 用于检测可选模块是否已安装\n */\n\n/**\n * 可选模块名称常量\n */\nexport const OptionalModules = {\n SEARCH: 'expo-gaode-map-search',\n NAVIGATION: 'expo-gaode-map-navigation',\n ROUTE: 'expo-gaode-map-route',\n GEOCODER: 'expo-gaode-map-geocoder',\n} as const;\n\n/**\n * 延迟加载可选模块\n * 使用示例:\n * \n * @example\n * ```typescript\n * import { OptionalModules, lazyLoad } from 'expo-gaode-map';\n * \n * let SearchModule = null;\n * \n * function loadSearch() {\n * if (SearchModule == null) {\n * try {\n * SearchModule = require('expo-gaode-map-search');\n * } catch (error) {\n * console.warn('搜索模块未安装');\n * return null;\n * }\n * }\n * return SearchModule;\n * }\n * \n * // 使用\n * const search = loadSearch();\n * if (search) {\n * const results = await search.searchPOI({ keyword: '餐厅' });\n * }\n * ```\n */\n\n/**\n * 检查必需模块,如果未安装则抛出错误\n * @param moduleName 模块名称\n * @param featureName 功能名称(用于错误提示)\n */\nexport function requireModule(moduleName: string, featureName: string): void {\n console.warn(\n `[expo-gaode-map] 使用 ${featureName} 需要安装 ${moduleName}。\\n` +\n `请运行: npm install ${moduleName}\\n` +\n `然后使用 try-catch 包裹 require('${moduleName}') 来加载`\n );\n}\n\n/**\n * 获取已安装的可选模块列表\n * 注意: 此函数无法在运行时准确检测,仅作为文档说明\n */\nexport function getInstalledModules(): string[] {\n console.warn(\n '[expo-gaode-map] getInstalledModules() 无法在运行时检测。\\n' +\n '请在编译时检查 package.json 中安装的模块'\n );\n return [];\n}\n\n/**\n * 打印已安装模块信息(用于调试)\n */\nexport function printModuleInfo(): void {\n console.log('[expo-gaode-map] 核心模块: 已加载');\n console.log('[expo-gaode-map] 可选模块检测:');\n console.log(' - 使用 try-catch 包裹 require() 来检测可选模块');\n console.log(' - 可用的可选模块:');\n Object.entries(OptionalModules).forEach(([key, value]) => {\n console.log(` - ${key}: ${value}`);\n });\n}\n\n/**\n * 创建延迟加载器\n * \n * @example\n * ```typescript\n * import { createLazyLoader } from 'expo-gaode-map';\n * \n * const loadSearch = createLazyLoader(() => require('expo-gaode-map-search'));\n * \n * // 使用时\n * const SearchModule = loadSearch();\n * if (SearchModule) {\n * const results = await SearchModule.searchPOI({ keyword: '餐厅' });\n * }\n * ```\n */\nexport function createLazyLoader<T>(loader: () => T): () => T | null {\n let cached: T | null = null;\n let attempted = false;\n\n return () => {\n if (!attempted) {\n attempted = true;\n try {\n cached = loader();\n } catch (error) {\n console.warn('[expo-gaode-map] 模块加载失败:');\n cached = null;\n }\n }\n return cached;\n };\n}"]}
|
|
@@ -116,7 +116,7 @@ public class ExpoGaodeMapModule: Module {
|
|
|
116
116
|
|
|
117
117
|
guard let keyToUse = finalKey, !keyToUse.isEmpty else {
|
|
118
118
|
print("⚠️ ExpoGaodeMap: 未提供 iosKey 且 Info.plist 中也无 AMapApiKey,无法初始化 SDK")
|
|
119
|
-
|
|
119
|
+
throw Exception(name: "INIT_FAILED", description: "未提供 API Key")
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
// 设置 API Key(若与现有不同或尚未设置)
|
|
@@ -131,6 +131,14 @@ public class ExpoGaodeMapModule: Module {
|
|
|
131
131
|
print("✅ ExpoGaodeMap: 已设置 API Key 并完成初始化(来源:\(providedKey != nil ? "入参 iosKey" : "Info.plist"))")
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
/**
|
|
135
|
+
* 设置是否加载世界向量地图
|
|
136
|
+
* @param enable 是否开启
|
|
137
|
+
*/
|
|
138
|
+
Function("setLoadWorldVectorMap") { (enable: Bool) in
|
|
139
|
+
MAMapView.loadWorldVectorMap = enable
|
|
140
|
+
}
|
|
141
|
+
|
|
134
142
|
/**
|
|
135
143
|
* 获取 SDK 版本号
|
|
136
144
|
*/
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-gaode-map",
|
|
3
|
-
"version": "2.2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.2.14",
|
|
4
|
+
"description": "A full-featured AMap (Gaode Map) React Native component library built with Expo Modules, providing map display, location services, overlays, and more.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"files": [
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"expo",
|
|
32
32
|
"expo-gaode-map",
|
|
33
33
|
"ExpoGaodeMap",
|
|
34
|
-
"高德地图"
|
|
34
|
+
"高德地图",
|
|
35
|
+
"AMap"
|
|
35
36
|
],
|
|
36
37
|
"repository": {
|
|
37
38
|
"type": "git",
|