2016-07-11 30 views
0

Ich bin neu zu reagieren native und ich versuche, Geolocation zu verwenden, um den Zustand zu aktualisieren.setState in componentDidMount() funktioniert nicht in Geolocation Callback

In componentDidMount() kann ich this.setState({lat: 1}); aufrufen und es funktioniert. Wenn ich jedoch this.setState({lat: 1}); aus dem Geolocation.getCurrentPosition() Callback aufrufen, stürzt die App ab. Ich teste auf einem physischen Gerät.

Ich habe alles abgestreift, um das Problem zu isolieren. Jede Hilfe wird sehr geschätzt.

Hier ist mein Code:

import React, { Component } from 'react'; 
import { AppRegistry,ScrollView, ListView, Text, View } from 'react-native'; 

class TestProject extends Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
     lat: 0 
     }; 
    } 

    componentDidMount() { 
     navigator.geolocation.getCurrentPosition(function(position) { 
     this.setState({lat: 1}); // this causes a crash - without this line the app does not crash. 
     }, 
     (error) => alert(error.message) 
    ); 

    this.setState({lat: 1}); // this works 
    } 

    render() { 
    return (
     <View> 
     <Text> 
      {this.state.lat} 
     </Text> 
     </View> 
    ); 
    } 
} 

AppRegistry.registerComponent('TestProject',() => TestProject); 
+0

'Selbst lassen = this; navigator.geolocation.getCurrentPosition (function (Position) { self.setState ({ lat: 1 });} , (Fehler) => alert (error.message) ); '- das funktioniert für mich . – Phil

+0

@Phil es funktioniert danke !! Ich dachte, du hättest das nicht mit ES6 machen müssen und ich konnte keine Beispiele mit dieser Technik finden? Wie auch immer, danke! –

+0

Schön zu hören! Ja ... manchmal musst du eine Var/Let mit "this" setzen. Zum Beispiel, wenn Sie 'forEach' verwenden und auf einen Bereich außerhalb dieses' forEach' zugreifen möchten. – Phil

Antwort

-1

Dank @Phil musste ich einfach eingestellt self = this:

let self = this; 
navigator.geolocation.getCurrentPosition(function(position) { self.setState({ lat: 1 }); }, (error) => alert(error.message)); 
Verwandte Themen