You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Navigation/Drawer 6中如何正确实现goBack返回上一页功能

@react-navigation/drawer 6.x goBack功能异常解决方案

问题根因

v6版本对Drawer导航的navigation对象作用域做了调整,你在Drawer.Screen的header参数中拿到的navigation是抽屉导航器自身的实例,而非嵌套在Drawer页面内部的子导航栈实例。直接调用navigation.goBack()时只会触发抽屉层级的回退逻辑,默认会直接回到抽屉的初始路由页面,因此出现你遇到的问题。

解决方案

方案1:增加可回退状态校验(适配header配置在Drawer层的场景)

调用goBack前先判断当前导航层是否有可回退的页面,若没有则调用父导航器的回退方法,同时可以消除相关警告:

<Drawer.Navigator>
    <Drawer.Screen 
        ....
        options={{
          header: ({ navigation, route, options }) => {
              const title = getHeaderTitle(options, route.name);
              return (
                <MyHeader 
                  title={title}
                  iconName={"menu"} 
                  goback={() => {
                    if (navigation.canGoBack()) {
                      navigation.goBack();
                    } else {
                      // 无回退内容时调用父导航器执行回退
                      navigation.getParent()?.goBack();
                    }
                  }}
                />
              );
          },
        }}
      />
</Drawer.Navigator>

方案2:将自定义Header移到子栈配置(更符合v6设计规范的推荐方案)

绝大多数项目中Drawer的每个页面都是独立的嵌套子栈(NativeStack/Stack导航),直接将Header配置在子栈层级,拿到的navigation就是当前子栈的实例,goBack自然就是返回子栈的上一页:

// 每个Drawer页面对应的独立子栈
const HomeStack = createNativeStackNavigator();
function HomeStackScreen() {
  return (
    <HomeStack.Navigator>
      <HomeStack.Screen 
        name="HomeIndex" 
        component={HomeIndex}
        options={{
          header: ({ navigation, route, options }) => {
            const title = getHeaderTitle(options, route.name);
            return (
              <MyHeader 
                title={title}
                iconName={"menu"} 
                goback={() => navigation.goBack()}
                // 如需打开抽屉可以调用 navigation.openDrawer()
              />
            );
          }
        }}
      />
      {/* 子栈其他页面 */}
      <HomeStack.Screen name="Detail" component={DetailPage} />
    </HomeStack.Navigator>
  )
}

// Drawer层配置,关闭Drawer自带的Header避免重复
<Drawer.Navigator>
  <Drawer.Screen 
    name="Home" 
    component={HomeStackScreen}
    options={{headerShown: false}}
  />
  {/* 其他Drawer页面 */}
</Drawer.Navigator>

内容的提问来源于stack exchange,提问作者Onoshe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:36:03