【问题标题】:React Native disable swiping StackNavigator in TabNavigatorReact Native 在 TabNavigator 中禁用滑动 StackNavigator
【发布时间】:2018-06-15 08:05:39
【问题描述】:

我有带有屏幕 1 和 2 的 TabNavigator 以及在屏幕 1 内我有带有屏幕 1.1 和 1.2 的 StackNavigator。我启用了滑动和手势。从 root 我可以在 1 和 2 之间滑动选项卡。当我在屏幕 1 上并打开屏幕 1.1 时,我仍然可以滑动到屏幕 2,当 1.1 屏幕打开时,我需要以某种方式禁用此功能。

我需要它像 Instagram 应用 (ios) 一样工作。当您在主屏幕 (1) 上时,您可以向左滑动以查看直接屏幕 (2)。当您从主屏幕 (1) 打开朋友个人资料时,它会以屏幕 (1.1) 的形式打开,您无法向左滑动以打开直接屏幕 (2)。你只能回去。

我的这个功能工作得很好,但是有了这个“错误”,我可以从屏幕 1.1 导航到屏幕 2。

我尝试通过阅读文档和其他人的导航问题以不同的方式解决此问题,但不知何故并没有真正按我的需要工作。我想我的嵌套屏幕结构或其他东西有问题,或者它以不同的方式解决。

有人有线索吗?

【问题讨论】:

    标签: reactjs react-native react-navigation


    【解决方案1】:

    虽然它有点老了,但我想也许可以避免一些人匆忙浏览讨论旧 React Navigation 版本的旧且无用的 GitHub 帖子。

    对于 React Navigation 5,只需创建 StackNavigator 并将带有 { gestureEnabled: false } 值的 options 属性传递给不应响应手势的屏幕:

    import { createStackNavigator } from '@react-navigation/stack';
    
    const Stack = createStackNavigator();
    
    const MyStack = () => {
      return (
        <Stack.Navigator
          initialRouteName="Home"
          headerMode="screen"
        >
          <Stack.Screen
            name="Settings"
            component={Settings}
            // disable gestures for one specific screen
            options={{
              gestureEnabled: false,
            }}
          />
        </Stack.Navigator>
      );
    }
    

    在此处阅读更多信息:https://reactnavigation.org/docs/stack-navigator/#example

    【讨论】:

    • 这并没有解决 OP 询问的场景,其中堆栈导航器嵌套在选项卡导航器中。像在代码中那样禁用手势将禁用在堆栈上向后滑动的功能,但不会禁用选项卡之间的滑动。我仍在寻找一种方法来禁用 React Navigation v5 中嵌套堆栈导航器的选项卡(MaterialTopTabNavigator)之间的滑动。
    【解决方案2】:

    在 React Navigation v5 中是 gestureEnabled 而不是 gesturesEnabled

    https://reactnavigation.org/docs/stack-navigator/#gestureenabled

    【讨论】:

      【解决方案3】:

      标签中的每个屏幕都可以单独设置导航选项swipeEnabled

      查看Tab Navigator Screen Navigation Options 文档。

      MyScreen.navigationOptions = ({navigation}) => ({
        swipeEnabled: false
      });
      

      您可以将该值设置为检查堆栈导航器是否已导航到的函数的结果。

      更新 - 反应导航 3

      此属性已被删除,并替换为 gesturesEnabled
      您可以单独设置每个屏幕的值,或在导航器配置级别设置默认值。

      const navigator = createStackNavigator(
        {
          Main: { screen: Main },
          ...
        },
        {
          defaultNavigationOptions: {
            gesturesEnabled: false,
          },
          ...
        }
      );
      

      【讨论】:

      • 谢谢你让我意识到我有 "react-navigation": "^1.0.0-beta.21" not latest .23 :)
      • @AnilkumariOSdeveloper 更新了最近的反应导航变化。
      • 我必须禁用选定屏幕的手势(不是所有屏幕),这样可以吗?
      • 我已经尝试过这个gesturesEnabled: false,但是不行,如果我刷卡就可以打开navigationdrawer。
      • @AnilkumariOSdeveloper 这与导航抽屉无关。这仅指在选项卡之间移动或关闭堆栈屏幕。
      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多