2017-10-09 27 views
0

我對我的反應原生項目有問題。當我與火力點登錄和我存儲的數據AsyncStorage它總是得到當在第一次登錄,但在第二次,這個錯誤不會顯示錯誤信息。我對這個問題很困惑。可能未處理的承諾拒絕(id:0):TypeError:TypeError:無法讀取屬性爲'null'的電子郵件

Dashboard.js

constructor(props){ 
    super(props); 
    this.state= { 
     user: null, 
     loading: true, 
    } 
} 

componentWillMount() { 
    AsyncStorage.getItem('userData').then((user_data_json) => { 
     let userData = JSON.parse(user_data_json); 
     this.setState({ 
      user: userData, 
      loading:false 
     }); 
     console.log(this.state.user) 
    }); 
} 

Logout(){ 
    AsyncStorage.removeItem('userData').then(() => { 
     firebase.auth().signOut().then(() => { 
      this.props.navigation.navigate('Login') 
     }); 

    }); 
    console.log(this.state.user) 
} 

render() { 
    if(this.state.loading){ 
     return <ActivityIndicator size="large" /> 
    } 
    return(
     <View> 
      <Text style={styles.title}> Hello {this.state.user.email} </Text> 
      <Button title="Log Out" onPress={this.Logout.bind(this)} /> 
     </View> 
    ) 
} 

}

回答

0

現在你想訪問this.state.user.email,但你的初始狀態設置user爲null。如果你改變你的初始狀態是一個空的對象,該錯誤將消失:

constructor(props) { 
    super(props); 
    this.state = { 
     user: {}, 
     loading: true 
    } 
} 
+0

** ** this.state.user是來自火力先生。我的意思是我將this.state.data保存到AsyncStorage –

+0

在你的構造函數中,你將用戶初始化爲'null'。您收到錯誤「無法讀取null的屬性電子郵件」。如果您在構造函數中將用戶設置爲空對象,則不會發生此錯誤。 –

0

出現該問題的從線: -

<Text style={styles.title}> Hello {this.state.user.email} </Text> 

有時候的setState需要一些時間在設定狀態,的setState完成其工作之前渲染被調用,在這種情況下,當時this.state.user不可用到那所以它拋出的錯誤。 所以你可以做以下,以避免在未來這樣的錯誤,您正在使用的渲染狀態變量: -

<Text style={styles.title}> Hello {this.state.user && this.state.user.email} </Text> 

,或者你也可以聲明狀態的用戶變量在構造函數: -

constructor(props) { 
    this.state = { 
     user:{ email: ''} 
    } 
相關問題