#android #react-native #geolocation
#Android #react-native #геолокация
Вопрос:
Спасибо, что посетили этот пост. У меня возникли проблемы с получением местоположения пользователя с помощью React Native.
Я довольно долго искал и читал сообщения других людей об этой функции. Похоже, у этой функции есть несколько проблем.
А также документация react native expo, похоже, устарела. https://docs.expo.dev/versions/latest/sdk/location / Я использую код отсюда в разделе использование.
import React, { useState, useEffect } from 'react';
import { Platform, Text, View, StyleSheet } from 'react-native';
import * as Location from 'expo-location';
export default function App() {
const [location, setLocation] = useState(null);
const [errorMsg, setErrorMsg] = useState("");
useEffect(async () => {
(async () => {
let { status } = await Location.requestForegroundPermissionsAsync();
console.log(status);
if (status !== 'granted') {
console.log("denied")
setErrorMsg('Permission to access location was denied');
return;
}
console.log("status", status); // <=== always says "granted"
let location = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.Highest,
maximumAge: 10000,
timeout: 5000
});
console.log({ location }) // <== never reach here.
setLocation(location);
setErrorMsg('No ERROR');
})();
}, []);
let text = 'Waiting..';
if (errorMsg) {
text = errorMsg;
} else if (location) {
text = JSON.stringify(location);
}
return (
<View>
<Text>{text}</Text>
</View>
);
}
Я видел одно из сообщений, в котором говорилось, что я должен передать аргументы accuracy, maximumAge
to getCurrentPositionAsync
, вместо {} empty object
которых это указано в документах expo.
Но все равно не работает. поскольку getCurrentPositionAsync
он висит, экран продолжает отображаться waiting...
.
И, конечно, я полагаю, что эмулятор Android настроен правильно, поскольку я вижу журнал состояния, и в нем говорится "granted"
.
Заранее большое спасибо за вашу помощь и чтение моего поста.
"expo": "~43.0.2",
"expo-location": "~13.0.4",
"expo-status-bar": "~1.1.0",
"react": "17.0.1",
"react-dom": "17.0.1",
"react-native": "0.64.3",
"react-native-web": "0.17.1"
Ответ №1:
Вы не можете использовать async с useEffect и, следовательно, не ожидать.
Вы пробовали наоборот?
const [position, setPosition] = useState(false)
// useEffect
Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.Highest,
maximumAge: 10000,
timeout: 5000
})
.then(res => setPosition(res))
.catch(e => console.log(e)
У меня также было больше шансов без IIFE с обезжиренной стрелкой, вы должны попробовать
(function () {
let { status } = await Location.requestForegroundPermissionsAsync();
console.log(status);
if (status !== 'granted') {
console.log("denied")
setErrorMsg('Permission to access location was denied');
return;
}
console.log("status", status); // <=== always says "granted"
let location = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.Highest,
maximumAge: 10000,
timeout: 5000
});
console.log({ location }) // <== never reach here.
setLocation(location);
setErrorMsg('No ERROR');
})();