世博会地点中的城市位置反应原生

Posted

技术标签:

【中文标题】世博会地点中的城市位置反应原生【英文标题】:City location in expo location react-native 【发布时间】:2021-03-01 06:06:20 【问题描述】:

我正在尝试使用 expo-location 仅提取城市位置。我能够使用此代码获取用户的完整位置:

1    import React,  useState, useEffect  from 'react';
2    import  Text, View, StyleSheet  from 'react-native';
3    import * as Location from 'expo-location';
4    
5    export default function App() 
6      const [location, setLocation] = useState(null);
7      const [errorMsg, setErrorMsg] = useState(null);
8    
9      useEffect(() => 
10       (async () => 
11          let  status  = await Location.requestPermissionsAsync();
12          if (status !== 'granted') 
13            setErrorMsg('Permission to access location was denied');
14          
15    
16          let regionName = await Location.reverseGeocodeAsync(  longitude: 37.6172999, latitude: 55.755826  );
17          setLocation(regionName);
18          console.log(regionName);
19       )();
20      , []);
21    
22      let text = 'Waiting..';
23      if (errorMsg) 
24        text = errorMsg;
25       else if (location) 
26        text = JSON.stringify(location);
27      
28    
29      return (
30        <View style=styles.container>
31          <Text>text</Text>
32        </View>
33      );
34    
35    
36    const styles = StyleSheet.create(
37      container: 
38        flex: 1,
39        backgroundColor: '#bcbcbc',
40        alignItems: 'center',
41        justifyContent: 'center',
42      ,
43      big: 
44        fontSize: 18,
45        color: "white",
46      
47    );
48

所以我尝试通过将 26 号线更改为 text = JSON.stringify([0].city); 来仅获取城市位置,但我的手机上不再显示任何内容...

终端向我显示来自 console.log 的日志:

Array [
  Object 
    "city": "Moscow",
    "country": "Russia",
    "district": "Central Administrative Okrug",
    "isoCountryCode": "RU",
    "name": "109012",
    "postalCode": "109012",
    "region": null,
    "street": null,
    "subregion": "Moscow",
    "timezone": null,
  ,
]

如果有人可以帮助我找到获取城市位置的方法,我将非常高兴

我认为如果我尝试将这座城市变成这样,从 22 号线改为 27 号线,这对我有帮助:

const city = "Waiting..."
if (errorMsg) 
city = errorMsg;
 else if (location) 
city = Object.keys(regionName).reduce((result, key) => 
  return result.concat(regionName[key].city)
, []);
;

只获取数组 [0],但由于某种原因,我唯一得到的是它:[未处理的承诺拒绝:错误:“城市”是只读的] 为什么是只读的?我没听懂...有人可以帮我吗?

【问题讨论】:

【参考方案1】:

截图:

下面是工作示例:

import React,  useEffect, useState  from 'react';
import  Text, View, StyleSheet, TouchableOpacity  from 'react-native';
import Constants from 'expo-constants';

// You can import from local files
import AssetExample from './components/AssetExample';

let apiKey = 'YOUR_API_KEY';

// or any pure javascript modules available in npm
import  Card  from 'react-native-paper';
import * as Location from 'expo-location';

export default function App() 
  const [location, setLocation] = useState(null);
  const [errorMsg, setErrorMsg] = useState(null);
  const [getLocation, setGetLocation] = useState(false);

  useEffect(() => 
    (async () => 
      let  status  = await Location.requestPermissionsAsync();
      if (status !== 'granted') 
        setErrorMsg('Permission to access location was denied');
      

      Location.setGoogleApiKey(apiKey);

      console.log(status);

      let regionName = await Location.reverseGeocodeAsync(
        latitude: 19.2514799,
        longitude: 75.7138884,
      );

      setLocation(regionName);
      console.log(regionName, 'nothing');

      // console.log();
    )();
  , [getLocation]);


  return (
    <View style=styles.container>
      <Text style=styles.big>
        !location ? 'Waiting' : JSON.stringify(location[0]["city"])
      </Text>
      <TouchableOpacity onPress=() => setGetLocation(!getLocation)>
        <View
          style=
            height: 100,
            backgroundColor: 'teal',
            justifyContent: 'center',
            alignItems: 'center',
            borderRadius: 10,
            marginTop: 20,
          >
          <Text style=styles.btnText> GET LOCATION </Text>
        </View>
      </TouchableOpacity>
    </View>
  );


const styles = StyleSheet.create(
  container: 
    flex: 1,
    backgroundColor: 'white',
    alignItems: 'center',
    justifyContent: 'center',
  ,
  big: 
    fontSize: 18,
    color: 'black',
    fontWeight: "bold"
  ,
  btnText:
    fontWeight: "bold",
    fontSize: 25,
    color: "white"
  
);

现场演示:Expo Snack

【讨论】:

真的好用!非常感谢您的帮助。 现在我正在尝试使用用户位置获得相同的结果,但我无法获得它。我该怎么办?我正在尝试使用 reverseGeocodeAsync() 从 getCurrentPositionAsync() 获取纬度和经度,我该怎么做? 用户位置是指从设备获取的当前位置? 如果是那么我已经更新了代码:snack.expo.io/@xeteke8423/crabby-pretzel 我试着看看我还能做些什么,最后,我弄清楚了它需要什么并且我能够得到它。再次非常感谢您有兴趣帮助我

以上是关于世博会地点中的城市位置反应原生的主要内容,如果未能解决你的问题,请参考以下文章

世博会苹果登录反应原生返回空值

电话不显示反应原生(世博会)上的所有文本

显示启动画面或加载指示器,直到所有图像都准备好 |世博会|反应原生

如果没有GPS,则无法使用navigator.geolocation进行反应原生的当前位置

世博会弹出反应本机项目上传的apk(由android studio构建)具有比清单文件更多的权限

反应原生空白 MapView