не могу найти местоположение переменной с reversegeocodeAsync - PullRequest
0 голосов
/ 11 апреля 2020

Привет всем, кто видит этот вопрос, я нуждаюсь в помощи в этом и надеюсь, что кто-то поможет, я пытаюсь найти точное местоположение для пользователя, чтобы в конечном итоге передать его в некоторых других функциях. Я использую Expo init и expo-location

при использовании (reversegeocodeAsyn c ({})) для первого рендера, он дает мне правильное местоположение, но при тестировании дает сбой, выдает ошибку и даже работает, это данные не создаются, как после установки состояния, они недоступны для использования в глобальном масштабе

Я пробовал разные способы Во-первых: используйте все функции на одной странице, но они не работают

import React, {useState, useEffect, useMemo} from 'react';
import {View, Text, StyleSheet, FlatList } from 'react-native';
import { NavigationEvents } from 'react-navigation';
import TimeApi from '../compnents/TimeApi';
import * as Location from 'expo-location';


const LocationScren = () => {
  const [time, setsTime] = useState({});
  const [errorMsg, setErrorMsg] = useState('');
  const [location, setLocation ] = useState(null);
  const [city, setCity ] = useState();

    const getLocation = async () => {
        let {status} = await Location.requestPermissionsAsync();
        if (status !== 'granted') {
            setErrorMsg('Access to Location denied');
        }

        const location = await Location.getCurrentPositionAsync({});
        setLocation(location)
    }

    const getCity = async () => {
        const place = await Location.reverseGeocodeAsync({
            latitude : location.coords.latitude,
            longitude : location.coords.longitude
        });

        place.find( p => {setCity(p.city);
        })
    }


    const getTime = async () => {
        const response = await TimeApi.get(`/${city}.json`);
        setTime(response.data);
}

    useEffect(() => {
    getTime(), getLocation(), getCity();
    } , []);


    console.log(time);
    console.log(location);
    console.log(city);

    return (
        <View>
        <FlatList 
        data = {time.items}
        keyExtractor = {time => time.first}
        renderItem = {({item}) => {
            return (
                <View>
                    <Text>  {item.first} </Text>
                    <Text>  {item.secnd} </Text>
                    <Text>  {item.third} </Text>
                    <Text>  {item.fourth} </Text>
                    <Text>   {item.fifth} </Text>
                    <Text>  {item.sixth} </Text>
                </View>
            );
        }}
        />
        {errorMsg ? <Text> {errorMsg} </Text> : null }
        </View>
    );
}

const styles = StyleSheet.create({});
export default LocationScren;

здесь, в первом рендере, он выдает ошибки, затем работает, затем выдает эту ошибку (null не является объектом (оценивает location.coords ')])

Затем я создаю файл контекста и добавляю свои функции и все равно получаю ту же ошибку точно

import createDataContext from './createDataContext';
import * as Location from 'expo-location';

const mwaqeetReducer = (state,action) => {
    switch(action.type) {
        case 'get_location' : 
            return action.payload;
        case 'add_error' : 
            return {...state, errorMessage : action.error};
        case 'get_city' : 
            return { cityName : action.payload};
        default:
            return state;
    }
}

const getLocation = dispatch => async () => {
    let {status} = await Location.requestPermissionsAsync();
    if (status === !'granted') {
        dispatch({type: 'add_error' , error : 'Permission to access location denied'});
    }

    let location = await Location.getCurrentPositionAsync({});
    dispatch({type : 'get_location' , payload : location});
    console.log(location);    
}

const getCity = dispatch => async () => {
    let keys = {
        latitude : location.coords.latitude,
        longitude : location.coords.longitude
    }
    const place = await Location.reverseGeocodeAsync(keys);
        place.find( p => p.city);
    dispatch({type : 'get_city' , payload : place});
    console.log(place);
}

export const {Provider, Context} = createDataContext(
    mwaqeetReducer, {
         getLocation, getCity
    } , {
        errorMessage : '', location : {}, cityName : ''
    }
)

, поэтому, пожалуйста, мне нужна помощь, чтобы преодолеть это.

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете попробовать что-то вроде этого.

  useEffect(() => {
    runFunction();
  } , []);
const runFunction = async () => {
        let {status} = await Location.requestPermissionsAsync();
        if (status !== 'granted') {
            setErrorMsg('Access to Location denied');
        }

        const location = await Location.getCurrentPositionAsync({});
        setLocation(location)

        const place = await Location.reverseGeocodeAsync({
            latitude : location.coords.latitude,
            longitude : location.coords.longitude
        });

        let city;
        place.find( p => {
          city = p.city
          setCity(p.city)
        });

        const response = await TimeApi.get(`/${city}.json`);
        setTime(response.data);

    }

...