我想做一个简单的任务:成功登录后,将用户重定向到他的主页。为此,我使用react-navigation的StackNavigator:
// App.js
class App extends Component {
render() {
return (<RootStack />);
}
}
const RootStack = createStackNavigator(
{
Login: { screen: Login, navigationOptions: { header: null }},
Home: { screen: Home, navigationOptions: { header: null }}
},
{
initialRouteName: 'Root'
}
)
如何防止用户登录后返回登录屏幕?为了防止在android中使用后退按钮,我将使用此按钮:
// Home.js
import React, { Component} from 'react';
import { ... , BackHandler } from 'react-native';
class Home extends Component {
constructor(props) {
super(props);
BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPressAndroid);
}
onBackButtonPressAndroid = () => {
return true;
}
}
但是这样做,我完全禁用了后退按钮。还有另一种方法可以达到这个目的吗?
答案 0 :(得分:3)
react native documentation上有一个很棒的页面,介绍如何进行身份验证流程。
您可能还不熟悉SwitchNavigator。 SwitchNavigator的目的是一次只显示一个屏幕。默认情况下,它不处理后退操作,并且在您离开时将路由重置为其默认状态。这是我们希望从身份验证流程中获得的确切行为:当用户登录时,我们希望放弃身份验证流程的状态并卸载所有屏幕,并且当我们按下硬件后退按钮时,我们希望无法进行操作。回到认证流程。我们使用导航动作在SwitchNavigator中的路线之间切换。您可以在API reference.
中阅读有关SwitchNavigator的更多信息。
根据文档,此SwitchNavigator
的实现方式如下:
import { createSwitchNavigator, createStackNavigator } from 'react-navigation';
// Implementation of HomeScreen, OtherScreen, SignInScreen, AuthLoadingScreen
// goes here.
const AppStack = createStackNavigator({ Home: HomeScreen, Other: OtherScreen });
const AuthStack = createStackNavigator({ SignIn: SignInScreen });
export default createSwitchNavigator(
{
AuthLoading: AuthLoadingScreen,
App: AppStack,
Auth: AuthStack,
},
{
initialRouteName: 'AuthLoading',
}
);
因此,要实现所需的功能,您需要将RootStack
更改为以下内容(注意,我尚未测试此代码):
const RootStack = createSwitchNavigator(
{
Loading: ,//put your loading screen here
Auth: { screen: Login, navigationOptions: { header: null }},
App: { screen: Home, navigationOptions: { header: null }}
},
{
initialRouteName: 'Loading'
}
)
然后,在加载屏幕中,您将获取所需的任何状态以确定用户是否已登录,然后致电this.props.navigation.navigate('App');
跳过登录屏幕,直接将用户带到您的应用,或this.props.navigation.navigate('Auth');
将您的用户发送到登录页面。 SwitchNavigator
会自动为您处理禁用向后导航。