7

Amacım, kullanıcı zaten giriş yapmışsa kullanıcıyı Home bileşenine yönlendirmektir. Kullanıcıya giriş yapabilir ve numaralı telefonu yalnızca _logInUser() numaralı telefona yeniden yönlendirebilirim . Ancak, Home bileşenine yeniden yönlendirildiğinde, simulatörü yenilediğimde, uygulama Login bileşenine geri döner.React Native - Firebase kullanıcısına giriş yapılıyor Ana Sayfa Bileşen

Bu sorunu componentWillMount() kullanarak ve let user = firebaseApp.auth().currentUser ayarlamayı denedim. Ancak, user'u konsola bağladım ancak if denetimi doğrudan else ifadesine gider. Herhangi bir anlayış için minnettar olurum!

index.ios.js

import React, { Component } from 'react'; 
import { Scene, Router } from 'react-native-router-flux'; 
import { 
    AppRegistry, 
} from 'react-native'; 

// Components 
import Login from './components/user/login/login'; 
import Home from './components/user/home/home'; 

class AppName extends Component { 
    render() { 
    return (
     <Router> 
     <Scene key="root"> 
      <Scene key="login" component={Login} title="Login" hideNavBar={true} initial={true}/> 
      <Scene key="home" component={Home} title="Home"/> 
     </Scene> 
     </Router> 
    ); 
    } 
} 


AppRegistry.registerComponent('AppName',() => AppName); 

login.js

import React, { Component } from 'react'; 
import { 
    AlertIOS, 
    Dimensions, 
    Image, 
    ScrollView, 
    StyleSheet, 
    Text, 
    TextInput, 
    TouchableOpacity, 
    View 
} from 'react-native'; 

import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; 
import { Actions } from 'react-native-router-flux'; 

import firebaseApp from 'AppName/firebase_setup'; 

// Set width and height to screen dimensions 
const { width, height } = Dimensions.get("window"); 

// For Firebase Auth 
const auth = firebaseApp.auth(); 

// Removed styles for StackOverflow 

export default class Login extends Component { 
    constructor(props) { 
    super(props); 

    this.state = { 
     email: '', 
     password: '' 
    } 
    } 

    componentWillMount() { 
    let user = auth.currentUser; 
    if (user != null) { 
     console.log(user); 
     Actions.home 
    } else { 
     return; 
    } 
    } 

    render() { 
    return (
     <View style={styles.mainContainer}> 
     <KeyboardAwareScrollView 
      style={styles.scrollView} 
      keyboardShouldPersistTaps={false} 
      automaticallyAdjustContentInsets={true} 
      alwaysBonceVertical={false} 
     > 
      <View style={styles.loginContainer}> 

      <View style={styles.inputContainer}> 

       <TextInput 
       style={styles.formInput} 
       placeholder="Email" 
       keyboardType="email-address" 
       autoFocus={true} 
       autoCorrect={false} 
       autoCapitalize="none" 
       onChangeText={(email) => this.setState({email})} 
       /> 

       <TextInput 
       style={styles.formInput} 
       secureTextEntry={true} 
       placeholder="Password" 
       autoCorrect={false} 
       autoCapitalize="none" 
       onChangeText={(password) => this.setState({password})} 
       /> 

       <TouchableOpacity 
       style={styles.loginButton} 
       onPress={this._logInUser.bind(this)} 
       > 
       <Text style={styles.loginButtonText}>Log In</Text> 
       </TouchableOpacity> 

       <TouchableOpacity> 
       <Text style={styles.toSignupButton}>Dont have an account? Create one!</Text> 
       </TouchableOpacity> 

      </View> 
      </View> 

      <View style={styles.footer}> 
      <Text style={styles.footerText}> 
       By signing up, I agree to TextbookSwap's <Text style={styles.footerActionText}>Terms of Service</Text> and <Text style={styles.footerActionText}>Privacy Policy</Text>. 
      </Text> 
      </View> 
     </KeyboardAwareScrollView> 
     </View> 
    ); 
    } 

    _logInUser() { 
    let email = this.state.email; 
    let password = this.state.password; 

    auth.signInWithEmailAndPassword(email, password) 
     .then(Actions.home) 
     .catch((error) => { 
     AlertIOS.alert(
      `${error.code}`, 
      `${error.message}` 
     ); 
     }); 
    } 
} 
+0

Üzgünüm, sizin için tam bir cevabım yok. Ancak, [Switch Feature] 'ın (https://github.com/aksonov/react-native-router-flux/blob/master/docs/OTHER_INFO.md#switch-new-feature) burada yararlı olabileceğine inanıyorum. –

cevap

5

Birincisi, içinde: İşte

benim (Ben yönlendirme için react-native-router-flux kullanıyorum) kodudur giriş bileşeniniz currentUser'ı senkronize olarak kontrol ediyor, ancak henüz uygun olmayabilir componentWillMount'ta mümkün. Sen uyumsuz almak gerekir edebilirsiniz.

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    // User is signed in. 
    } else { 
    // No user is signed in. 
    } 
}); 

kullanıcı açtıysa Actions.home() çağırmak için yeterli olacaktır Büyük olasılıkla Ancak, uygulaması Girişi ekrandan yukarı bu mantığı taşımak isteyebilirsiniz büyüdükçe. Kyle'ın önerdiği gibi, Switch özelliğini kullanabilirsiniz. Genellikle bu gibi redux birlikte kullanıldığında, (alıntı dokümanlara): Eğer redux kullanmak istemiyorsanız

const RootSwitch = connect(state => ({loggedIn: state.transient.loggedIn}))(Switch); 
const rootSelector = props => props.loggedIn ? 'workScreens' : 'authScreens'; 

const scenes = Actions.create(
    <Scene key="root" tabs={true} component={RootSwitch} selector={rootSelector}> 
    <Scene key="authScreens" hideNavBar={true}> 
     <Scene key="login" component={Login} initial={true}/> 
     <Scene key="register" component={Register} /> 
     ... 
    </Scene> 
    <Scene key="workScreens"> 
     <Scene key="home" component={Home} initial={true}/> 
     <Scene key="profile" component={ProfileMain}/> 
     ... 
    </Scene> 
    </Scene> 
); 

, el yerine tepki-redux en bağlamak kullanmanın Anahtarı sarın ve Switch için desteklemek loggedin geçebilir . Örneğin, böyle bu sarmalayıcı, bir şeye onAuthStateChanged Firebase dinleyebilirsiniz:

class FirebaseSwitch extends Component { 

    state = { 
    loggenIn: false 
    } 

    componentWillMount() { 
    firebase.auth().onAuthStateChanged(user => 
     this.setState({loggedIn: !!user}) 
    ); 
    } 

    render() { 
    return <Switch loggedIn={this.state.loggedIn} {...this.props}/>; 
    } 
} 
+0

Çözümü beğendim. Redux olmadan onu uygulamaya çalışıyorum ve "connect undefined" yazan bu hatayı alıyorum. Bu bir Redux yöntemi mi? Bunu Redux olmadan nasıl yapardım? FirebaseSwitch bileşenini oluşturdum ve önerdiğiniz gibi "index.ios.js" dosyasına aktardım. Tekrar teşekkürler!!! – szier

+0

Evet, bağlantı reak-redux. RouterSwitch'i Router sahnelerinizde FirebaseSwitch ile değiştirin. –

+0

Harika teşekkürler. Bunu yaptım ama 'rootSelector' 'props.loggedIn' olarak nasıl adlandırılabileceğini merak ediyorum, çünkü simülatörü yeniden yüklediğimde yüklenen ilk' Scene 'her zaman authScreens'dir. – szier