expo-gaode-map 2.2.12 → 2.2.13
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 +2 -2
- package/android/src/main/java/expo/modules/gaodemap/overlays/PolylineView.kt +65 -51
- 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 +1 -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
|
|
@@ -87,10 +87,10 @@ class ExpoGaodeMapModule : Module() {
|
|
|
87
87
|
getLocationManager() // 初始化定位管理器
|
|
88
88
|
} catch (e: SecurityException) {
|
|
89
89
|
android.util.Log.e("ExpoGaodeMap", "隐私协议未同意: ${e.message}")
|
|
90
|
-
throw e
|
|
90
|
+
throw expo.modules.kotlin.exception.CodedException("PRIVACY_NOT_AGREED", e.message ?: "用户未同意隐私协议", e)
|
|
91
91
|
} catch (e: Exception) {
|
|
92
92
|
android.util.Log.e("ExpoGaodeMap", "SDK 初始化失败: ${e.message}")
|
|
93
|
-
throw e
|
|
93
|
+
throw expo.modules.kotlin.exception.CodedException("INIT_FAILED", e.message ?: "SDK 初始化失败", e)
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
}
|
|
@@ -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
|
}
|
|
@@ -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":"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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] 处理折叠状态变化失败:');\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(若与现有不同或尚未设置)
|
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.13",
|
|
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",
|