找不到导航对象。您的组件是不是在导航器的屏幕内?

Posted

技术标签:

【中文标题】找不到导航对象。您的组件是不是在导航器的屏幕内?【英文标题】:Couldn't find a navigation object. Is your component inside a screen in a navigator?找不到导航对象。您的组件是否在导航器的屏幕内? 【发布时间】:2021-04-10 06:07:46 【问题描述】:

在我下面的代码中,当我使用 useNavigation() 时,它会给出一个错误,比如我的问题 如何使用useNavigation,请任何人都可以解决这个错误... 错误:找不到导航对象。您的组件是否在导航器的屏幕内? 我按照这里的代码https://rnfirebase.io/messaging/notifications#handling-interaction

import React, useState, useEffect  from 'react';
import messaging from '@react-native-firebase/messaging';
import  NavigationContainer, useNavigation  from "@react-navigation/native";
import  createStackNavigator, HeaderTitle,  from "@react-navigation/stack";
const Stack = createStackNavigator();

function App(props) 
     const navigation = props.navigation
    //const navigation = useNavigation();
    const [initialRoute, setInitialRoute] = useState('Splash Screen');

    useEffect(() => 
        messaging().onMessage(remoteMessage => 
            navigation.navigate("Description Screen");
            console.log(props.navigation)
        );
    , []);

    return (
        <NavigationContainer>
            <Stack.Navigator
                initialRouteName=initialRoute
                headerMode="none"
                screenOptions=
                    gestureEnabled: true,

                
            >

                <Stack.Screen name="Splash Screen" component=SplashScreen />
                <Stack.Screen name="Description Screen" component=DescriptionScreen />
            </Stack.Navigator>

        </NavigationContainer>

    );


export default App;

【问题讨论】:

您找到解决方案了吗?我遇到了同样的问题。 【参考方案1】:

您无法访问导航,因为它还没有准备好。您可以为您的导航创建 Ref,然后将其导出并在您想要的地方使用它。

// App.js

import  NavigationContainer  from '@react-navigation/native';
import  navigationRef  from './RootNavigation';

export default function App() 
  return (
    <NavigationContainer ref=navigationRef>/* ... */</NavigationContainer>
  );

`

然后你可以通过定义和导出你的方法来使用它

// RootNavigation.js

import * as React from 'react';

export const navigationRef = React.createRef();

export function navigate(name, params) 
  navigationRef.current?.navigate(name, params);

您可以通过任何方式使用onReadycall back 表示您的导航已准备就绪

// App.js

import  NavigationContainer  from '@react-navigation/native';
import  navigationRef, isReadyRef  from './RootNavigation';

export default function App() 
  React.useEffect(() => 
    return () => 
      isReadyRef.current = false
    ;
  , []);

  return (
    <NavigationContainer
      ref=navigationRef
      onReady=() => 
        isReadyRef.current = true;
      
    >
      /* ... */
    </NavigationContainer>
  );

【讨论】:

您忘记了上述解决方案中的 isReadyRef 实现 export const isReadyRef = React.createRef(); 如前所述,这并不完整,尚未更新。因此,我将在此处放置原始文档的链接,以防有人遇到与我相同的问题。 IT 建议采用非常相似的方法。 reactnavigation.org/docs/navigating-without-navigation-prop【参考方案2】:

UseNavigation() 提供对作为屏幕一部分的组件内部的导航对象的访问。由于您使用的是 app(),我认为它是主屏幕本身,它未在堆栈导航器中定义,因此 useNavigation 将不起作用。它可以在堆栈导航器中定义的屏幕中工作,例如描述屏幕和启动屏幕。在这里你可以使用这个

function app(props)
    const navigation = props.navigation
    //Rest of your code

这应该会有所帮助。

【讨论】:

它得到一个错误 TypeError: undefined is not an object (evaluating 'navigation.navigate') 尝试console.log(props.navigation)看是否定义了。 它没有定义它的未定义 您可以发布包含更改的更新代码吗? 我刚刚编辑了我的代码,你可以在上面的代码中看到

以上是关于找不到导航对象。您的组件是不是在导航器的屏幕内?的主要内容,如果未能解决你的问题,请参考以下文章

导航组件:找不到NavController

TypeError:在导航状态中找不到“路线”

获取 ReferenceError:找不到变量:由于 onPress 中的方法而导致的 TouchableOpacity

框架布局接管屏幕并隐藏底部导航和工具栏

用酶浅渲染找不到元素

反应页面之间的导航