如何通过检查用户状态在 react-native-router-flux 中设置初始场景?
How to set initial scene in react-native-router-flux with checking the state of the user?
如何根据用户登录状态在 react-native-router-flux 中设置初始场景。这是我想要实现此功能的代码。如果用户登录,我想要场景 2,如果用户未登录,我想要场景 1。
我遇到此代码的问题,它总是 return 第一个屏幕而不是场景 2 我让用户处于登录状态。
import React, { Component } from 'react';
import { Router, Scene } from 'react-native-router-flux';
import Scene1 from '../Scene1';
import Scene2 from '../Scene2';
// localization strings
import strings from '../config/localization';
import styles from './Styles';
class Routes extends Component {
state = {
isUserLogin: false
}
async componentDidMount() {
await AsyncStorage.getItem('user', (err, result) => {
if (result != null) {
this.setState({ isUserLogin: JSON.parse(result).isUserLoggedIn });
}
if (__DEV__) {
console.log('routes', this.state); // return trur or false if user logged in or not
}
});
}
render() {
return {
<Router
backAndroidHandler={() => Actions.pop()}
sceneStyle={styles.sceneStyle}
>
<Scene key="root">
<Scene
key="merchants"
component={Scene1}
title={strings.selectBusiness}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
initial={!this.state.isUserLogin}
/>
<Scene
key="initializeStore"
component={Scene2}
hideNavBar
initial={this.state.isUserLogin}
/>
<Scene
key="login"
component={Login}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
back
renderBackButton={renderBackButton}
/>
</Scene>
</Router>
}
}
}
export default Routes;
我也有同样的问题,如果用户已登录,您必须检查欢迎屏幕而不是导航屏幕。
请在此处查看:
并添加此
type={ActionConst.RESET}
在您的 <Scene>
中,如果用户已登录,您希望第一个出现。
这可以通过使用通过 RNRF V4
提供给每个 Scene
的 on
、success
和 failure
道具来实现
以下是您可以如何添加到您的代码中:
import React, { Component } from 'react';
import { Router, Scene } from 'react-native-router-flux';
import Scene1 from '../Scene1';
import Scene2 from '../Scene2';
// localization strings
import strings from '../config/localization';
import styles from './Styles';
class Routes extends Component {
state = {
isUserLogin: false
}
async componentDidMount() {
await AsyncStorage.getItem('user', (err, result) => {
if (result != null) {
this.setState({ isUserLogin: JSON.parse(result).isUserLoggedIn });
}
if (__DEV__) {
console.log('routes', this.state); // return trur or false if user logged in or not
}
});
}
// HELPER FUNCTION FOR AUTH
authenticate = () => {
this.state.isUserLogin ? true : false
}
render() {
return {
<Router
backAndroidHandler={() => Actions.pop()}
sceneStyle={styles.sceneStyle}
>
<Scene key="root">
<Scene
key="Launch"
component="Launch"
initial
on={this.authenticate}
success="Scene2"
failure="Scene1"
/>
<Scene
key="merchants"
component={Scene1}
title={strings.selectBusiness}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
initial={!this.state.isUserLogin}
/>
<Scene
key="initializeStore"
component={Scene2}
hideNavBar
initial={this.state.isUserLogin}
/>
<Scene
key="login"
component={Login}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
back
renderBackButton={renderBackButton}
/>
</Scene>
</Router>
}
}
}
export default Routes;
添加的 Launch
场景只是一个占位符场景,在 RNRF 执行其逻辑时出现。你可以让这个场景变得简单,只需添加你的标志或任何你喜欢的东西,因为它不会出现太久。
深思
您的 Router
将很难通过这种方式达到 Login
。将每个部分 "logged in scenes" 和 "logged out scenes" 包装在 stack
或 scene
中将使 on
重定向更好地流动。
如果您想了解我如何处理这个问题,请查看我的存储库 here!
如何根据用户登录状态在 react-native-router-flux 中设置初始场景。这是我想要实现此功能的代码。如果用户登录,我想要场景 2,如果用户未登录,我想要场景 1。
我遇到此代码的问题,它总是 return 第一个屏幕而不是场景 2 我让用户处于登录状态。
import React, { Component } from 'react';
import { Router, Scene } from 'react-native-router-flux';
import Scene1 from '../Scene1';
import Scene2 from '../Scene2';
// localization strings
import strings from '../config/localization';
import styles from './Styles';
class Routes extends Component {
state = {
isUserLogin: false
}
async componentDidMount() {
await AsyncStorage.getItem('user', (err, result) => {
if (result != null) {
this.setState({ isUserLogin: JSON.parse(result).isUserLoggedIn });
}
if (__DEV__) {
console.log('routes', this.state); // return trur or false if user logged in or not
}
});
}
render() {
return {
<Router
backAndroidHandler={() => Actions.pop()}
sceneStyle={styles.sceneStyle}
>
<Scene key="root">
<Scene
key="merchants"
component={Scene1}
title={strings.selectBusiness}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
initial={!this.state.isUserLogin}
/>
<Scene
key="initializeStore"
component={Scene2}
hideNavBar
initial={this.state.isUserLogin}
/>
<Scene
key="login"
component={Login}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
back
renderBackButton={renderBackButton}
/>
</Scene>
</Router>
}
}
}
export default Routes;
我也有同样的问题,如果用户已登录,您必须检查欢迎屏幕而不是导航屏幕。
请在此处查看:
并添加此
type={ActionConst.RESET}
在您的 <Scene>
中,如果用户已登录,您希望第一个出现。
这可以通过使用通过 RNRF V4
提供给每个Scene
的 on
、success
和 failure
道具来实现
以下是您可以如何添加到您的代码中:
import React, { Component } from 'react';
import { Router, Scene } from 'react-native-router-flux';
import Scene1 from '../Scene1';
import Scene2 from '../Scene2';
// localization strings
import strings from '../config/localization';
import styles from './Styles';
class Routes extends Component {
state = {
isUserLogin: false
}
async componentDidMount() {
await AsyncStorage.getItem('user', (err, result) => {
if (result != null) {
this.setState({ isUserLogin: JSON.parse(result).isUserLoggedIn });
}
if (__DEV__) {
console.log('routes', this.state); // return trur or false if user logged in or not
}
});
}
// HELPER FUNCTION FOR AUTH
authenticate = () => {
this.state.isUserLogin ? true : false
}
render() {
return {
<Router
backAndroidHandler={() => Actions.pop()}
sceneStyle={styles.sceneStyle}
>
<Scene key="root">
<Scene
key="Launch"
component="Launch"
initial
on={this.authenticate}
success="Scene2"
failure="Scene1"
/>
<Scene
key="merchants"
component={Scene1}
title={strings.selectBusiness}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
initial={!this.state.isUserLogin}
/>
<Scene
key="initializeStore"
component={Scene2}
hideNavBar
initial={this.state.isUserLogin}
/>
<Scene
key="login"
component={Login}
navigationBarStyle={styles.navigationBarStyle}
navBarButtonColor={styles.navBarButtonColor}
titleStyle={styles.titleStyle}
back
renderBackButton={renderBackButton}
/>
</Scene>
</Router>
}
}
}
export default Routes;
添加的 Launch
场景只是一个占位符场景,在 RNRF 执行其逻辑时出现。你可以让这个场景变得简单,只需添加你的标志或任何你喜欢的东西,因为它不会出现太久。
深思
您的 Router
将很难通过这种方式达到 Login
。将每个部分 "logged in scenes" 和 "logged out scenes" 包装在 stack
或 scene
中将使 on
重定向更好地流动。
如果您想了解我如何处理这个问题,请查看我的存储库 here!