阻止用户在 React Native 中成功登录后返回登录屏幕

Posted

技术标签:

【中文标题】阻止用户在 React Native 中成功登录后返回登录屏幕【英文标题】:Prevent user from going back to login screen after logging in successfully in React Native 【发布时间】:2020-03-07 21:30:34 【问题描述】:

我有 3 个屏幕。 A=>登录,B=>仪表板,C=>个人资料。

最初,当用户未登录时,登录屏幕会呈现。登录后,我使用 AsyncStorage 来保存 userId(我从 API 响应中获得)。 如果用户已经登录并打开应用程序,我已将用户重定向到仪表板页面。

这些是我在代码实现中面临的问题。

    登录后,如果用户在仪表板页面(Andriod)上按下返回按钮,它会导航回登录屏幕。这次没有调用 componentDidMount() 方法,所以我无法检查用户是否来自仪表板屏幕。 我尝试在 Dashboard 的 componentDinMount() 方法上注册 BackHandler 事件,条件 => 如果用户按下返回按钮,应用程序将退出,但问题是我无法在同一屏幕上删除此事件,所以如果我去从仪表板到配置文件屏幕,如果我按后退按钮从配置文件页面,应用程序退出。

我想要实现的是,登录后,直到用户按下注销按钮,用户应该无法进入登录屏幕。

【问题讨论】:

React Native - Device back button handling的可能重复 【参考方案1】:

您需要重置导航历史记录

这是我的一个项目中的一个 sn-p,我需要做同样的事情:

this.props.navigation.reset([NavigationActions.navigate( routeName: 'DevicesList')], 0);

【讨论】:

【参考方案2】:

当从“登录屏幕”导航到“仪表板”时,您可以通过使用切换导航器而不是堆栈导航器来简单地实现此目的。

const MainStack = createStackNavigator(
    DashboardScreen: Dashboard,
    ProfileScreen: Profile
);

export default createAppContainer(createSwitchNavigator(
  LoginScreen: Login,
  Main: MainStack
));

【讨论】:

【参考方案3】:

为此,我建议使用 SwitchNavigator(如果使用 react-navigation)。这将使前一个屏幕(在本例中为您的 LoginScreen)卸载,并且您将无法返回该屏幕,除非您明确告诉它导航到该屏幕。

如果没有,您仍然可以在仪表板屏幕中使用自定义 backHandling,并使用 react-navigaton withNavigationFocus HOC。

componentDidMount 将与您的第一次尝试保持一致。您需要使用 componentDidUpdate 并检查 isFocused 属性,例如:

componentDidUpdate = prevProps => 
   if (prevProps.isFocused !== this.props.isFocused) 
        this.props.isFocused ? this.backHandler = BackHandler.addEventListener('hardwareBackPress', this.handleBackPress) :
        this.backHandler.remove()
   

如果您对其中一种解决方案有疑问,请告诉我

【讨论】:

【参考方案4】:

React Navigation v5 文档涵盖了这个用例。 documentation link

【讨论】:

【参考方案5】:

要限制用户在成功登录后返回登录屏幕,请使用navigation.replace()。准确地说,制作 2 个不同的堆栈导航器;一个用于入职和登录/注册,第二个用于应用屏幕。

然后在唱歌完成后运行navigation.replace() 而不是navigation.navigate()

这将删除或分离先前的导航器与整个路由嵌套,直到它被注销。并且在注销时使用相同的概念将用户重定向到登录屏幕。

【讨论】:

【参考方案6】:

这是一个使用 StackActions 和 useNavigation 挂钩的示例

// Navigation index
export default function AppNavigation() 
  const Stack = createStackNavigator();
  return (
    <NavigationContainer>
      <Stack.Navigator
        initialRouteName="Login"
        screenOptions=headerShown: false>
        <Stack.Screen name="Login" component=Login />
        <Stack.Screen name="App" component=MainNavigator />
      </Stack.Navigator>
    </NavigationContainer>
  );


// Login
export default function Login() 
    const navigation = useNavigation();
    useEffect(() => 
        // Authenticate the user input
        if (authenticate(input)) 
            navigation.dispatch(StackActions.replace('App'));
        
    , [...])
    ...

【讨论】:

以上是关于阻止用户在 React Native 中成功登录后返回登录屏幕的主要内容,如果未能解决你的问题,请参考以下文章

成功的 Firebase 身份验证后 React Native App 无法导航

React Native (Android) - 应用在“打开方式”列表中出现两次

如何在使用 firebase/auth 和 react-native 验证他/她的电子邮件后立即登录用户而不创建整个登录页面?

登录React Native时无法重定向用户

有效登录后React Native iOS“Safari无法打开页面,因为地址无效”

如何在 react native 和 facebook sdk 中管理用户帐户状态?