Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error while updating property 'coordinate' of a view managed by: AIRMapMarker (React native)

Tags:

react-native

I have been searching the web for proper documentation in regards to this error, am in in no luck as i am unable to determine the cause of this error.

Here is the my entire code:

First section: setting the states

export default class Whereto extends Component<{}> {

constructor(props) {
    super(props);

    this.state = {
        latitude: null,
        longitude: null,
        location: null,
        error: null,
        markers:[],

    };
}

Second section Component did Mount

componentDidMount() {
        navigator.geolocation.getCurrentPosition(
            (position) => {
                this.setState({
                    latitude: position.coords.latitude,
                    longitude: position.coords.longitude,
                    error: null,
                });

                //geocode api
                var myApiKey = '';

                fetch('https://maps.googleapis.com/maps/api/geocode/json?address=' + position.coords.latitude + ',' + position.coords.longitude + '&key=' + myApiKey)
                    .then((response) => response.json())
                    .then((responseJson) => {
                        //console.log('ADDRESS GEOCODE is BACK!! => ' + JSON.stringify(responseJson));
                        var locationName = responseJson.results[0].address_components.filter(x => x.types.filter(t => t === 'administrative_area_level_2').length > 0)[0].short_name;
                        //console.log(locationName);
                        this.setState({
                            location: locationName,
                        })
                    })

                //nearby api
                var apiPlaceskey = '';
                //https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&type=restaurant&keyword=cruise&key=YOUR_API_KEY

                fetch('https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=' + position.coords.latitude + ',' + position.coords.longitude + '&radius=2000&type=bus_station&key=' + apiPlaceskey)
                    .then((respplaces) => respplaces.json())
                    .then((responseJson2) => {

                        const markers = responseJson2.results.map((result) => ({
                            latlng: {
                                latitude: result.geometry.location.lat,
                                longitude: result.geometry.location.lng,
                            }
                        }));

                        this.setState({ markers });
                    });


            },
            (error) => this.setState({error: error.message}),
            {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000},

        );


    }

Third section: A function reserved when a a touchable button is tapped on my render and View section

fetchDirections = () => {
        //directions api
        var apiDirectionskey = '';
        //const {location} = this.state;
        const {latitude} = this.state;
        const {longitude} = this.state;

        fetch('https://maps.googleapis.com/maps/api/directions/json?origin=' + latitude + ',' + longitude + '&destination=' + goingto + '&mode=transit&transit_mode=bus&key=' + apiDirectionskey)
            .then((resdirections) => resdirections.json())
            .then((responseJson3) => {

                console.log(responseJson3);

            });


        }

    render(){

        return(
            <View style={styles.container}>
                <Mainlogo/>
                <TextInput style={styles.boxInput} underlineColorAndroid='rgba(0,0,0,0)' placeholder="Going To?"
                           underlineColorAndroid='transparent'
                           onChangeText={(dest) => this.setState({goingto : dest})}
                />
                <TouchableOpacity style={styles.button} onPress={this.fetchDirections.bind(this)}>
                    <Text style={styles.textButton}> Go {this.props.type}</Text>
                </TouchableOpacity>

                <MapView style={styles.map}
                         region={{
                             latitude: this.state.latitude,
                             longitude: this.state.longitude,
                             latitudeDelta: 0.02,
                             longitudeDelta: 0.02
                         }}
                >

                </MapView>

                <MapView.Marker
                    coordinate={{
                        latitude: this.state.latitude,
                        longitude: this.state.longitude,
                        latitudeDelta: 0.02,
                        longitudeDelta: 0.02
                    }}
                    image={require('../img/my-pin-512.png')}
                    title={'you are here'}
                />

                {this.state.markers.map(marker => (
                    <MapView.Marker
                        coordinate={marker.latlng}
                        image={require('../img/busstop.png')}

                    />

                ))}





            </View>
        )

    }
}

To get to this stage a touchableopacity is tapped from my main profile page. I realised that i am using componendDidMount and a seperate fetch function to call another API call. It seems that it is not getting enough time to pupulate the states to cause the null values

enter image description here

like image 937
johnobc Avatar asked Apr 20 '18 12:04

johnobc


4 Answers

Set initial state values to 0 instead of null.

this.state = {
  latitude:0,
  longitude: 0,
  latitudeDelta: 0.09,
  longitudeDelta: 0.02,
};
like image 157
Sunil Kumar Avatar answered Nov 17 '22 15:11

Sunil Kumar


I was receiving the lat, lng value as props so what worked for me was:

<Marker
coordinate={{
            longitude: longitude ? longitude : 0,
            latitude: latitude ? latitude : 0
          }}
title={'owner location'}
/>
like image 39
ishab acharya Avatar answered Nov 17 '22 16:11

ishab acharya


Changing the initial value in coordinates from null to [] solved the issue.

<MapView.Polyline
    strokeWidth={2}
    strokeColor="#00ff00"
    coordinates={coords}
/>
like image 2
Bill Zelenko Avatar answered Nov 17 '22 16:11

Bill Zelenko


passing this helped me solve this:

coordinate={{
     latitude: props && props.position && Number(props.position.latitude) ? Number(props.position.latitude) : 0,
     longitude: props && props.position && Number(props.position.longitude) ? Number(props.position.longitude) : 0 
}}
like image 1
Joepus Avatar answered Nov 17 '22 15:11

Joepus