You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native获取位置时出现MapMarker坐标必填项为空错误

问题解决:React Native MapMarker 坐标为空报错

错误信息

  • 设备端提示:Error while updating property 'corrdinate' of view managed by: AIRMapMarker
  • 控制台提示:ERROR Warning: Failed prop type: The prop coordinate.latitude is marked as required in MapMarker, but its value is null.

问题原因

初始状态下location为null,此时渲染用户位置的Marker时,coordinate.latitude和coordinate.longitude会因location && location.coords.latitude的逻辑返回null,而react-native-maps的Marker组件要求coordinate的经纬度必须是有效的非空数值,因此触发报错。

解决方案

方案1:条件渲染用户位置Marker

仅在location存在且包含有效坐标时,才渲染标记用户位置的Marker:

<MapView
  style={{
    width: Dimensions.get("window").width,
    height: Dimensions.get("window").height,
  }}
  initialRegion={{
    latitude: place.latitude,
    longitude: place.longitude,
    longitudeDelta: 0.01,
    latitudeDelta: 0.01,
  }}
>
  <Marker
    coordinate={{
      latitude: place.latitude,
      longitude: place.longitude,
    }}
  />

  {/* 仅当location存在时渲染用户位置Marker */}
  {location && location.coords && (
    <Marker
      title="Sua localização"
      coordinate={{
        latitude: location.coords.latitude,
        longitude: location.coords.longitude,
      }}
    />
  )}
</MapView>

方案2:添加异常处理与默认值

在获取位置的异步函数中添加try/catch,避免获取位置失败导致location一直为null;同时可给location设置初始默认坐标(比如与place一致):

useEffect(() => {
  (async () => {
    try {
      let { status } = await Position.requestBackgroundPermissionsAsync();

      if (status !== "granted") {
        setErrorMsg("App não tem permissão para acessar localizaçõa");
        return;
      }

      let location = await Position.getCurrentPositionAsync({
        accuracy: Position.Accuracy.High
      });
      setLocation(location);
    } catch (err) {
      setErrorMsg("Falha ao obter localização: " + err.message);
      // 设置默认坐标,避免Marker报错
      setLocation({ coords: { latitude: place.latitude, longitude: place.longitude } });
    }
  })();
}, []);

完整修改后的代码

import { useContext, useEffect, useState } from "react";
import Context from "../../global/Context";
import MapView, { Marker } from "react-native-maps";
import * as Position from "expo-location";
import {
  View,
  StyleSheet,
  ImageBackground,
  Dimensions,
  Text,
  TouchableOpacity,
} from "react-native";

const Location = (props) => {
  const [location, setLocation] = useState(null);
  const [errorMsg, setErrorMsg] = useState(null);
  const { states } = useContext(Context);
  const place = states.place;

  useEffect(() => {
    (async () => {
      try {
        let { status } = await Position.requestBackgroundPermissionsAsync();

        if (status !== "granted") {
          setErrorMsg("App não tem permissão para acessar localizaçõa");
          return;
        }

        let location = await Position.getCurrentPositionAsync({
          accuracy: Position.Accuracy.High
        });
        setLocation(location);
      } catch (err) {
        setErrorMsg("Falha ao obter localização: " + err.message);
        setLocation({ coords: { latitude: place.latitude, longitude: place.longitude } });
      }
    })();
  }, []);

  let text = "Carregando...";
  if (errorMsg) {
    text = errorMsg;
  } else if (location) {
    text = JSON.stringify(location);
  }

  return (
    <ImageBackground
      style={{ flex: 1 }}
      source={require("../../img/mypoint-wallpaper.jpg")}
    >
      <View style={styles.container}>
        <MapView
          style={{
            width: Dimensions.get("window").width,
            height: Dimensions.get("window").height,
          }}
          initialRegion={{
            latitude: place.latitude,
            longitude: place.longitude,
            longitudeDelta: 0.01,
            latitudeDelta: 0.01,
          }}
        >
          <Marker
            coordinate={{
              latitude: place.latitude,
              longitude: place.longitude,
            }}
          />

          {location && location.coords && (
            <Marker
              title="Sua localização"
              coordinate={{
                latitude: location.coords.latitude,
                longitude: location.coords.longitude,
              }}
            />
          )}
        </MapView>
        <Text style={styles.txtStyle}>{text}</Text>
      </View>
    </ImageBackground>
  );
};

内容的提问来源于stack exchange,提问作者Fran Fí de Nena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:45:49