【问题标题】:How to use useNavigation() within @react-navigation drawer?如何在@react-navigation 抽屉中使用 useNavigation()?
【发布时间】:2020-05-22 01:50:24
【问题描述】:

当前行为

我有一个 react-native 应用程序,它使用 react-navigation v5 进行路由。

  1. 我的所有视图中都有一个抽屉(左侧偏移菜单)
  2. 我使用 stackNavigation 进行页面转换。

由于(1),我的结构是drawerNavigator (a) > stackNavigator (b) > views (c)

当我尝试在 <DrawerContent /> 中调用 useNavigation() 挂钩时,出现以下错误:

Error: We couldn't find a navigation object. Is your component inside a navigator?
    at useNavigation (bundle.js:8766)

是的,我不在stackNavigator 内,所以无法调用钩子

预期行为

我希望在我的<DrawerContent /> 中提供导航。

您的环境

| software                       | version |
| ------------------------------ | ------- |
| iOS or Android                 | iOS, Android and web
| @react-navigation/native       | 5.0.0-alpha.41
| @react-navigation/stack         | 5.0.0-alpha.63
| @react-navigation/drawer       | 5.0.0-alpha.41
| react-native-reanimated        | 1.4.0
| react-native-gesture-handler   | 1.5.3
| react-native-safe-area-context | 0.6.2
| react-native-screens           | 2.0.0-alpha.32
| react-native                   | https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz
| expo                           | SDK36
| node                           | v13.5.0
| npm or yarn                    | 6.13.7

我如何在@react-navigation/drawer 中使用@react-navigation/stack,或者我应该如何使用它们构建我的抽屉和应用程序?

【问题讨论】:

    标签: javascript reactjs react-native react-navigation react-context


    【解决方案1】:

    这可以使用https://reactnavigation.org/docs/en/navigating-without-navigation-prop.html

    创建RootNavigation

    import { createRef } from 'react';
    
    export const navigationRef = createRef();
    
    export function navigate(name, params) {
      navigationRef.current?.navigate(name, params);
    }
    
    export function goBack() {
      navigationRef.current?.goBack();
    }
    

    App.js:

    import { navigationRef } from './navigation/RootNavigation';
    // ...
    <NavigationContainer
      ref={navigationRef}
    >
      {children}
    </NavigationContainer>
    

    然后从任何来源导入RootNavigation,您将不必担心反应树。

    【讨论】:

    • 无论如何,无法达到closeDrawer功能。对我来说,这个例子很有效:rb.gy/ra0irs
    • 这也带来了很多问题(功能缺失、当前路线不好等...),请注意我还没有找到恢复所有功能的好有效的解决方案。
    【解决方案2】:

    我也在使用 React Navigation 5x,我遵循了本指南,但仍然使用第一种方法成功(对于旧的 RNavigation)。 细节:模拟useNavigation函数

    jest.mock(‘react-navigation-hooks’, () => ({
     useNavigation: () => jest.fn(),
     useNavigationParam: jest.fn(jest.requireActual(
      'react-navigation-hooks'
     ).useNavigationParam),
    }));
    

    【讨论】:

    • 我将如何在我的测试组件中实现这个功能。你能给我举一个 V5 的例子吗?。
    【解决方案3】:

    如果您在导航器的屏幕上,则不必使用useNavigation

    导航器的结构如下。

    • stackNavigator
      • 抽屉导航器
        • 抽屉屏幕
    • stackScreens

    画面移动如下。

    示例

    function HomeScreen({ navigation }) {
      return (
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
          <Button
            onPress={() => navigation.navigate('moveScreenName')}
            title="Go to moveScreenName"
          />
        </View>
      );
    }
    

    useNavigation 是一个钩子,可以访问navigation 对象。当您无法将 navigation 属性直接传递到组件中时,它很有用,或者在嵌套深度嵌套的孩子的情况下不想传递它。

    useNavigation() 返回它所在屏幕的导航属性。

    示例

    function MyBackButton() {
      const navigation = useNavigation();
    
      return (
        <Button
          title="Back"
          onPress={() => {
            navigation.goBack();
          }}
        />
      );
    }
    

    【讨论】:

    • 我在导航器中不在屏幕上,我在DrawerContent中。另外,我的结构是drawerNavigator wrapping stackNavigator,你建议做相反的事情吗?如果我这样做了,那只是因为我想要一个抽屉用于我的所有应用程序,而不是每个堆栈视图一个抽屉
    • @DimitriKopriwa 您现在要做的是将所有堆栈放在一个抽屉中。我也是这样做的。结构任你支配。但是要按照你想要的方式做,我的回答结构很好。
    • 我尝试使用您推荐的布局,但不幸的是,我遇到了这个错误:A navigator can only contain 'Screen' components as its direct children (found DrawerNavigator)。如果您尝试制作一个,您有一个实施示例吗?
    • 除了你的文件结构告诉stackScreens 的兄弟stackNavigator 这实际上是不可能的,其余的与我的问题无关。我很想看到一个工作示例,说明如何在与我不同的场景中创建抽屉而不为每个页面创建多个抽屉。
    【解决方案4】:

    您可以在此处关注此视频 - https://youtu.be/hLP1G29bbLU

    你可以看到 视频中的useNavigation hook

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多