如何在navigation.js文件中的react-navigation中获取当前路线名称?

6 navigation react-native react-navigation react-hooks

我想知道当前的路由名称,但在导航 js 文件中,我在任何组件中使用 useRoute 挂钩并且工作良好,但是当我在 navigation.js 中使用 useRoute 时出现此错误

错误:找不到路线对象。您的组件是否位于导航器屏幕内?

navigation.js 代码示例,

export default function Navigation() {
  const route = useRoute(); // show error >> Error: Couldn't find a route object. Is your component inside a screen in a navigator?
  
  return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}>
            <Stack.Screen name="HomeScreen" component={HomeScreen} />
      </Stack.Navigator>
  );
}
Run Code Online (Sandbox Code Playgroud)

当我删除 useRoute 时,错误消失了,但我需要使用 useRoute 或任何其他方式来获取 navigation.js 文件中的当前路由名称。

Dav*_*olz 11

您可以将 传递navigationContainerRefNavigationContainer组件Navigation以使该navigation对象可访问。

考虑以下代码片段。

import { createNavigationContainerRef } from "@react-navigation/native"

export const navigationRef = createNavigationContainerRef()

const App = () => {
    return <NavigationContainer
              ref={navigationRef}>
                 <Navigation navigation={navigationRef} />
            </NavigationContainer>  
}
export default App
Run Code Online (Sandbox Code Playgroud)

然后,里面Navigation

export default function Navigation({ navigation }) {

  const route = navigation.current?.getCurrentRoute()
  
  return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}>
            <Stack.Screen name="HomeScreen" component={HomeScreen} />
      </Stack.Navigator>
  );
}
Run Code Online (Sandbox Code Playgroud)

然后使用 访问当前路线名称route?.name

编辑:正如 jhon antoy 在评论中正确指出的那样,如果我们导航到不同的屏幕,这不会更新当前的路线状态。我们需要自己更新它,如下所示。

export const navigationRef = createNavigationContainerRef();

const App = () => {
  const [routeName, setRouteName] = useState();

  return (
    <NavigationContainer
      ref={navigationRef}
      onReady={() => {
        setRouteName(navigationRef.getCurrentRoute().name)
      }}
      onStateChange={async () => {
        const previousRouteName = routeName;
        const currentRouteName = navigationRef.getCurrentRoute().name;
        console.log("route", currentRouteName)
        setRouteName(currentRouteName);
      }}
    >
       <Navigation routeName={routeName} />
    </NavigationContainer>
  );
}

export default App;
Run Code Online (Sandbox Code Playgroud)

里面Navigation

export function Navigation(props) {

  const route = props.routeName

  console.log(props)

  return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}>
            <Stack.Screen name="HomeScreen" component={HomeScreen} />
      </Stack.Navigator>
  );
}
Run Code Online (Sandbox Code Playgroud)

我用一些简单的导航按钮做了一份小吃。