在react导航中禁用后退按钮

IT技术 reactjs react-native navigation react-navigation
2021-04-22 08:13:24

我正在使用 React Native 导航 (react-navigation) StackNavigator。它从登录页面开始,贯穿应用程序的整个生命周期。我不想有返回选项,返回登录屏幕。有谁知道如何在登录屏幕后隐藏在屏幕上?顺便说一句,我还使用以下方法将其隐藏在登录屏幕中:

const MainStack = StackNavigator({
  Login: {
    screen: Login,
    navigationOptions: {
      title: "Login",
      header: {
        visible: false,
      },
    },
  },
  // ... other screens here
})
6个回答

1) 要使后退按钮在 react-navigation v2 或更新版本中消失:

v2-v4:

navigationOptions:  {
    title: 'MyScreen',
    headerLeft: null
}

v5

{     
    navigationOptions:  {
    title: 'MyScreen',
    headerLeft: ()=> null, // Note: using just `null` instead of a function should also work but could trigger a TS error
}

2)如果要清理导航堆栈:

假设您在要从中导航的屏幕上:

如果您使用的是 react-navigation v5 或更新版本,您可以使用navigation.resetCommonActions.reset

 // Replace current navigation state with a new one,
 // index value will be the current active route:

navigation.reset({
  index: 0,
  routes: [{ name: 'Profile' }],
});

来源和更多信息:https : //reactnavigation.org/docs/navigation-prop/#reset

或者:

navigation.dispatch(
  CommonActions.reset({
    index: 1,
    routes: [
      { name: 'Home' },
      {
        name: 'Profile',
        params: { user: 'jane' },
      },
    ],
  })
);

来源和更多信息在这里:https : //reactnavigation.org/docs/navigation-actions/#reset

对于旧版本的react导航:

v2-v4使用StackActions.reset(...)

import { StackActions, NavigationActions } from 'react-navigation';

const resetAction = StackActions.reset({
  index: 0, // <-- currect active route from actions array
  actions: [
    NavigationActions.navigate({ routeName: 'myRouteWithDisabledBackFunctionality' }),
  ],
});

this.props.navigation.dispatch(resetAction);

v1使用NavigationActions.reset

3) 对于 android,您还必须使用 BackHandler 禁用硬件后退按钮

http://reactnative.dev/docs/backhandler.html

或者如果你想使用钩子:

https://github.com/react-native-community/hooks#usebackhandler

否则,如果导航堆栈为空,应用程序将在按下 android 硬件后退按钮时关闭。

其他来源:感谢在下面添加评论并帮助更新 v5 的此答案的用户。

你是国王
2021-05-24 08:13:24
当您在 2018 年使用“StackAction.reset(...)”而不是“NavigationActions.reset(...)”时,请参阅reactnavigation.org/docs/en/stack-actions.html
2021-05-28 08:13:24
似乎 API 再次得到改进,至少在 v5 中,现在有一种更短的方法来执行重置操作:reactnavigation.org/docs/navigation-prop#reset
2021-05-29 08:13:24
使用“index:1”时“无法读取未定义的键”。所以为了修复这个错误,我使用了“index:0”。我觉得有道理
2021-05-31 08:13:24
这将删除后退按钮,但在 android 中我们仍然可以使用设备后退按钮进行导航。有没有办法禁用它?
2021-06-04 08:13:24

您是否考虑过使用this.props.navigation.replace( "HomeScreen" )而不是this.props.navigation.navigate( "HomeScreen" ).

这样您就不会向堆栈中添加任何内容。因此,如果在 Android 中按下后退按钮或在 IOS 中向右滑动屏幕,则 HomeScreen 不会挥动任何要返回的内容。

更多信息请查看文档当然,你可以通过设置隐藏后退按钮headerLeft: nullnavigationOptions

你应该做的警告错误修复` ()=>null`
2021-06-04 08:13:24
您不能使用替换传递参数。
2021-06-10 08:13:24
tq 它有效... params 也可以传递
2021-06-15 08:13:24

我们需要将 falsegesturesEnabledheaderLeftto一起设置null因为我们也可以通过滑动屏幕来导航回来。

navigationOptions:  {
   title: 'Title',
   headerLeft: null,
   gestureEnabled: false,
}
gesturesEnabled 甚至不作为属性存在!
2021-05-28 08:13:24
好的!手势启用正是我一直在寻找的。多谢!!
2021-06-05 08:13:24

您可以使用 隐藏后退按钮left:null,但对于 android 设备,当用户按下后退按钮时,它仍然可以返回。您需要重置导航状态并隐藏按钮left:null

以下是重置导航状态的文档:https :
//reactnavigation.org/docs/navigation-actions#reset

此解决方案适用于react-navigator 1.0.0-beta.7,但left:null不再适用于最新版本。

在 iOS 上,您仍然可以从屏幕边缘滑动以弹回。绝对需要重置导航状态。
2021-06-12 08:13:24

使用来自 react native 的 BackHandler 对我有用。只需在您的 ComponentWillMount 中包含这一行:

BackHandler.addEventListener('hardwareBackPress', function() {return true})

它将禁用 android 设备上的后退按钮。

这仅适用于 Android。
2021-06-16 08:13:24