安装
yarn add react-native-amap-geolocation
使用
const {coords} = useLocation()
console.log('ccc', coords)
const {location} = useLocation('watch')
console.log('l333', location.city)
useLocation.ts
import React, {useCallback, useEffect, useState} from "react"
import { PermissionsAndroid } from "react-native"
import { init, Geolocation } from "react-native-amap-geolocation"
import {AMAP_ANDROID_KEY} from '@/constants/constants'
interface Position {
coords: {
accuracy: number
altitude?: number
heading: number
latitude: number
longitude: number
speed: number
}
location?: any
}
interface PositionWatch {
coords: {
accuracy: number
altitude?: number
heading: number
latitude: number
longitude: number
speed: number
}
location: {
accuracy: number
adCode: string
address: string
altitude: number
city: string
cityCode: string
coordinateType: string
country: string
description: string
district: string
errorCode: number
errorInfo: string
gpsAccuracy: number
heading: number
latitude: number
locationType: number
longitude: number
poiName: string
province: string
speed: number
street: string
streetNumber: string
timestamp: number
trustedLevel: number
}
timestamp: number
}
type TLocType = 'watch'
function useLocation (): Position
function useLocation (locType: TLocType): PositionWatch
function useLocation (locType?: TLocType): Position | PositionWatch {
const [position, setPosition] = useState<Position>({
coords: {
latitude: 0,
longitude: 0,
accuracy: 0,
heading: 0,
speed: 0,
},
location: {}
})
const initAMap = useCallback(async () => {
await PermissionsAndroid.requestMultiple([
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION,
]);
await init({
ios: '',
android: AMAP_ANDROID_KEY
})
}, [])
const getPosition = useCallback<() => Promise<Position>>(() => {
return new Promise((resolve, reject) => {
Geolocation.getCurrentPosition(({ coords }) => {
resolve({coords: coords})
}, err => {
reject(err)
})
})
}, [])
useEffect(() => {
let wid
async function init() {
await initAMap()
if(locType === 'watch'){
wid = Geolocation.watchPosition((curPosition) => {
setPosition({...curPosition})
}, (err) => {
console.log('实时定位出错:', err)
Geolocation.clearWatch(wid)
})
}else{
const curPos = await getPosition()
setPosition({...curPos, location: {}})
}
}
init()
return () => {
locType === 'watch' && Geolocation.clearWatch(wid)
}
}, [initAMap, getPosition, locType])
return position
}
export default useLocation