2017-11-11 95 views
0

我的第一個React項目。我想要做的是首先顯示徽標,然後檢查用戶是否登錄。如果是,他們直接進入下一頁。如果不是登錄表單出現在同一頁面的徽標下方。與Facebook應用在打開時的工作方式類似。反應本機和firebase:如何登錄後如何顯示登錄表單?

我得到了什麼至今使用火力地堡進行身份驗證:

loginCheck(){ 
    const { navigate } = this.props.navigation; 
    firebase.auth().onAuthStateChanged(function(user) { 
     if (user) { 
     navigate('Feed'); 
     } else { 
     return (
      <View style={styles.formContainer}> 
      <FormLabel>Email</FormLabel> 
      <FormInput 
      onChangeText={(email) => this.setState({ email })}/> 
      <FormLabel>Password</FormLabel> 
      <FormInput 
      secureTextEntry 
      onChangeText={(password) => this.setState({ password })}/> 
      <Text style={styles.statusText}>{ this.state.error }</Text> 
      {this.renderButtonOrLoading()} 
      </View> 
     ) 
     } 
    }); 
    } 

    render() { 
    return (
     <KeyboardAvoidingView behavior="padding" style={styles.container}> 
     <View style={styles.loginContainer}> 
      <Image resizeMode="contain" style={styles.logo} source={require('../../components/images/logo.png')} /> 
     </View> 
     {this.loginCheck()} 
     </KeyboardAvoidingView> 
    ); 
    } 
} 

目的是讓一切的loginCheck()return聲明顯示在渲染,如果用戶沒有登錄我知道我的做法是錯誤的,只是不知道如何去解決它。

renderButtonOrLoading()看來,做工精細,但是當我在render()用的loginCheck()return聲明一切替換{this.loginCheck()}

renderButtonOrLoading(){ 
    if(this.state.loading){ 
     return (<Text style={styles.statusText}>Loading</Text>); 
    } 
    return (
     <View> 
     <Button 
     onPress={this.onLoginPress.bind(this)} 
     title='Login'/> 
     <Button 
     onPress={this.onSignupPress.bind(this)} 
     title='Sign Up'/> 
     </View> 
    ); 
    } 

希望得到任何幫助,一直困住這個問題一段時間。

回答

0

我的猜測是,你對firebase.auth().onAuthStateChanged()呼叫未及時完成對render - 即你調用Promise但在此之前render被調用它不能解決。如果您在該承諾的.then()區塊內致電setState,您至少會觸發重新渲染,但這仍然意味着您每次致電render時都會提出auth的新請求。我的建議是你auth檢查移到componentDidMount

componentDidMount() { 
    firebase.auth().onAuthStateChanged(function(user) { 
     if (user) { 
      this.setState({ isAuthorized: true }); 
     } else { 
      this.setState({ isAuthorized: false }); 
    }); 
} 

,然後只用三元運算符中render,以確定要顯示的UI:

render() { 
    ...your base code 
    {this.state.isAuthorized ? navigate('Feed') : <Your Login UI>} 
} 

您也可以看看這個庫 - 身份驗證狀態在應用重新啓動/啓動時持續存在:https://github.com/invertase/react-native-firebase祝您好運!

+0

似乎得到一個錯誤。 this.setState'是未定義的。 – user3458571

+0

所以我可以證實這似乎是正確的方法,如果我手動設置狀態我得到正確的結果,所以謝謝你!現在我想我需要在Firebase身份驗證功能中進行某種綁定。我只是不知道如何.. – user3458571

+0

你的'firebase'對象是怎麼進來的?您需要確保它已初始化以與您的Firebase帳戶配合使用。最好的方法是在應用程序的入口點初始化'firebase',然後將其作爲'prop'傳遞給需要它們的子組件。檢查你的「網絡」請求,確保它發送請求並返回一些東西!如果您認爲這對他人有幫助,請投票回答! –