1
resposta

Por que os Markers nem sempre aparecem no MapView?

Existem 4 parceiros. Cada parceiro tem um endereço. Os endereços são convertidos em coordenadas no hook useCoordinates. Mas os marcadores nem sempre são carregados no mapa.

/src/page/mapa/index.js

export default function Mapa() {

  const {coordenadas, carregaCoordenadas} = useCoordenadas();
  const [localizacaoAtual, setLocalizacaoAtual] = useState({});
  const [permiteGPS, setPermiteGPS] = useState(false);
  const [mapReady, setMapReady] = useState(false);
  const navigation = useNavigation();


  const geolocation = Geolocation;

  const requestLocationPermission = async () => {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
          title: 'Geolocation Permission',
          message: 'Can we access your location?',
          buttonNeutral: 'Ask Me Later',
          buttonNegative: 'Cancel',
          buttonPositive: 'OK',
        },
      );
      if (granted === 'granted') {
        console.log('Permissão para acesso à geolocalização concedida')
        setPermiteGPS(true);
        return true;
      } else {
        console.log('Permissão para acesso à geolocalização não concedida');
        return false;
      }
    } catch (err) {
      return false;
    }
  };

  useEffect( () => {

    carregaCoordenadas();
    requestLocationPermission();

}, [])

  useEffect( () => {

    permiteGPS && geolocation.getCurrentPosition(
      position => {
        setLocalizacaoAtual({
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
          coordinates: {
            latitude: position.coords.latitude,
            longitude: position.coords.longitude
          }
        });
      },
      error => {
        console.log(error.message.toString());
      },
      {
        showLocationDialog: true,
        enableHighAccuracy: true,
        timeout: 20000,
        maximumAge: 0
      }
    );

}, [permiteGPS])

useEffect(() => {

},[coordenadas])

  return (
      <View>
          <BarraPesquisa style={estilos.searchSection} />
          { ( localizacaoAtual !== undefined &&  
              localizacaoAtual.hasOwnProperty('latitude') && 
              localizacaoAtual.hasOwnProperty('longitude')) && 
          <MapView 
            onMapReady={() => setTimeout(() => setMapReady(true), 10000)}
            loadingEnabled = 
            provider="google"
            style={estilos.map} 
            initialRegion={{
            latitude: localizacaoAtual.latitude,
            longitude: localizacaoAtual.longitude,
            latitudeDelta: 0.04,
            longitudeDelta: 0.05,
            }}
          >
              { coordenadas && coordenadas.map((coordenada, i) => {
                return (

                    <Marker
                      key=
                      tracksViewChanges={!mapReady}
                      coordinate={{"latitude": coordenada.lat, "longitude": coordenada.lng}}
                      pinColor={"orange"} 
                      onPress={() => { 
                        navigation.navigate('ParceiroDetalhes', coordenada.detalhes) }}>

                      <Image source= style={{height: 35, width: 35}}/>

                    </Marker>

                )
              })
             }
          </MapView>
  }
      </View>
  )
}

/src/hooks/useCoordenadas.js

export default function useCoordenadas() {

    const [ coordenadas, setCoordenadas ] = useState([]);

    const carregaCoordenadas = async () => { 

        const parceiros = await listaParceiros();
        let coordenadasArray = [];

        Geocode.setApiKey("MY_API_KEY");
        Geocode.setRegion("br");
        Geocode.setLanguage("cs");
        Geocode.enableDebug(true);

        Promise.all(
            parceiros.map((parceiro) => {

                Geocode.fromAddress(parceiro.Endereco).then(
                    (response) => {
                          const location = response.results[0].geometry.location;
                          if(location.hasOwnProperty('lat') && location.hasOwnProperty('lng')){
                            coordenadasArray.push({
                              detalhes: parceiro,
                              lat: location.lat,
                              lng: location.lng,
                            });
                          }
                    },
                    (error) => {
                      console.error(error);
                    }
                  )
        })).then(() => {

            setCoordenadas(coordenadasArray)
        }
        )
    }

    return { coordenadas, carregaCoordenadas };

1 resposta

Olá, César!

Pelo código que você compartilhou, parece que os marcadores nem sempre são carregados no mapa. Isso pode estar acontecendo por algumas razões. Vou tentar te ajudar com algumas possíveis soluções.

  1. Verifique se o array de coordenadas está sendo preenchido corretamente: No seu hook useCoordenadas, você está buscando as coordenadas dos parceiros e armazenando em coordenadasArray. Verifique se esse array está sendo preenchido corretamente e se os objetos dentro dele possuem as propriedades lat e lng. Você pode adicionar alguns console.log para debugar e verificar se os valores estão corretos.

  2. Certifique-se de que o estado mapReady está sendo atualizado corretamente: No seu componente MapView, você está utilizando o estado mapReady para controlar o carregamento dos marcadores. Verifique se esse estado está sendo atualizado corretamente e se está sendo passado corretamente para a propriedade tracksViewChanges do Marker. Você pode adicionar um console.log para verificar se o valor de mapReady está correto.

  3. Verifique se os marcadores estão dentro da área visível do mapa: Verifique se as coordenadas dos marcadores estão dentro da área visível do mapa. Pode ser que os marcadores estejam sendo renderizados, mas estão fora da área visível do mapa, fazendo com que não sejam exibidos. Você pode verificar isso ajustando os valores de latitudeDelta e longitudeDelta na propriedade initialRegion do MapView.

Espero que essas sugestões possam te ajudar a resolver o problema. Se você tiver mais alguma dúvida, é só perguntar. Estou aqui para ajudar!

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software