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

React Native中如何在Tab Navigator内嵌套使用Stack Navigator

错误原因

你触发报错的核心问题是NavigationContainer作为导航根容器,只能挂载唯一的根导航组件,你当前代码里把Stack.Navigator和Tab.Navigator作为同级组件放在NavigationContainer下,结构完全不符合React Navigation的规范,才会抛出route.key相关的类型错误。

正确实现逻辑

你的需求是将Add Budget页面归属于Budget模块、不显示在底部Tab栏,只允许从Budget页点击FAB跳转,正确的嵌套逻辑是:将Tab导航作为根导航,给Budget模块单独嵌套一层Stack导航,把Budget主页面和Add Budget页面都放在这个子Stack里。

完整实现代码

1. 封装Budget模块的子Stack导航

import { createStackNavigator } from '@react-navigation/stack';

const BudgetStack = createStackNavigator();

function BudgetStackScreen() {
  return (
    <BudgetStack.Navigator>
      {/* Budget主页面,会显示在底部Tab栏 */}
      <BudgetStack.Screen 
        name="BudgetMain" 
        component={budget} 
        options={{ headerShown: false }} 
      />
      {/* Add Budget页面,仅能从Budget主页面跳转,不会出现在Tab栏 */}
      <BudgetStack.Screen 
        name="Add Budget" 
        component={addBudget} 
      />
    </BudgetStack.Navigator>
  );
}

2. 修改根Tab导航配置

import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
// 可选导入:如果需要跳转Add Budget时隐藏底部Tab栏需要用到
import { getFocusedRouteNameFromRoute } from '@react-navigation/native';

const Tab = createBottomTabNavigator();

export default function RootNavigation() {
  return (
    <NavigationContainer>
      <Tab.Navigator
        // 可选配置:跳转Add Budget时隐藏底部Tab栏
        screenOptions={({ route }) => {
          const focusedRoute = getFocusedRouteNameFromRoute(route);
          return {
            tabBarStyle: {
              display: focusedRoute === 'Add Budget' ? 'none' : 'flex'
            }
          }
        }}
      >
        <Tab.Screen name="Home" component={getTransaction} />
        {/* 替换原来的budget组件为封装好的BudgetStackScreen */}
        <Tab.Screen name="Budget" component={BudgetStackScreen} />
        <Tab.Screen name="Register" component={register} />
        <Tab.Screen name="Login" component={login} />
        <Tab.Screen name="TransactionDetails" component={transactionDetails} />
        <Tab.Screen name="Profile" component={profile} />
        <Tab.Screen name="CSV" component={exportToCSV} />
      </Tab.Navigator>
    </NavigationContainer>
  );
}

3. FAB跳转代码无需修改

你原有Budget页面的FAB跳转逻辑可以直接正常运行,不需要调整:

<FAB
   style={styles.fab}
   icon="plus"
   color="#5FC5FF"
   onPress={() => this.props.navigation.navigate("Add Budget")}
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:45:03