Почему getCurrentPositionAsync никогда ничего не возвращает?

#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');
})();