アプリが起動するたびにメインコンポーネントに誘導しようとしています。reactirectネイティブルータフラックスを使用してFirebaseユーザをメインコンポーネントにリダイレクト
私はナビゲーションラッパーとしてFire-Baseを使用し、バックエンドとしてFirebaseを、状態管理ライブラリとしてReduxを使用します。
ここに問題があります。私はfirebase.auth().onAuthStateChanged()
をルーターコンポーネントに入れて、ユーザーがログインしているかどうかを判断します。
ユーザーがいない場合は、ログインコンポーネントを返します。
ログインしているユーザーがいる場合は、メインコンポーネントをスタックの基本コンポーネントとして返します。
このSO POSTは正確な問題を抱えており、提案された答えは反応ネイティブルータフラックスからSwitch Featureを使用することを示唆しています。私はそれを助けてくれませんでした。
ここに私のコードです。
App.js
import React, { Component } from 'react';
import firebase from 'firebase';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk'
import reducers from './reducers';
import Router from './Router';
class App extends Component {
componentWillMount() {
firebase.initializeApp({
//my firebase config
});
}
render() {
const store = createStore(reducers, {}, applyMiddleware(ReduxThunk));
return (
<Provider store={store}>
<Router />
</Provider>
);
}
}
export default App;
Router.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { isLoggedIn } from './actions';
import { Scene, Router, Actions, Switch } from 'react-native-router-flux';
import firebase from 'firebase';
import Login from './components/auth/Login';
import Register from './components/auth/Register';
import Main from './components/Main';
class RouterComponent extends Component {
state = { loggedIn: false }
componentWillMount() {
this.props.isLoggedIn();
}
render() {
return(
<Router sceneStyle={{ }} hideNavBar={true}>
<Scene key="root">
<Scene key="authContainer" initial>
<Scene key="login" component={Login} title="Login Page" />
<Scene key="register" component={Register} title="Register Page" />
</Scene>
<Scene key="mainContainer">
<Scene key="main" component={Main} title="Main Page" />
</Scene>
</Scene>
</Router>
)
}
}
export default connect(null, { isLoggedIn })(RouterComponent);
私のReduxのアクションクリエイターの一部
export const isLoggedIn = (dispatch) => {
return(dispatch) => {
firebase.auth().onAuthStateChanged((user) => loginUserSuccess(dispatch, user));
};
};
const loginUserSuccess = (dispatch, user) => {
dispatch({
type: LOGIN_USER_SUCCESS,
payload: user
});
Actions.mainContainer({ type: 'reset'});
};
私は、正確な動機はを達成することができる理解非同期スニペット以下:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// return <Main />
} else {
// Stay at login screen
}
});
しかし、私はreact-native-router-fluxで再作成しようとしています。
ここでは、皆さんがもっと理解できるように、私のアプリのGIFショットがあります。 ユーザーは既にログインしています。しばらくするとメイン画面が送出されます。どんな考え?
このアプローチはちょうど今私の心に来ましたが、根本的な原因を解決しませんでしたか? :) –
**ログイン**コンポーネントを初期ルートとして設定するので、アプリが起動するとすぐに**ログイン**画面が表示されます。 **スプラッシュ**画面の実装は一般的なプラクティスであり、ユーザーフレンドリーです。 – datnt
@datntこれを追加する方法については、チュートリアルのソースがありますか?私は同じエラーが発生します。 – EQuimper