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

React Navigation集成Firebase Auth时遇嵌套导航警告求助

问题原因与解决方案

你收到的提示核心原因是重复嵌套了<NavigationContainer>。React Navigation要求整个应用只需要一个顶层的NavigationContainer来统一管理导航状态,而你的AuthStack和UnauthedStack里又各自添加了NavigationContainer,导致不必要的嵌套触发了警告。

虽然提示提到可以用independent={true},但你的场景完全不需要嵌套导航容器,正确做法是移除子栈中的NavigationContainer,同时修正状态变量名不匹配的问题。

具体修改步骤

1. 修正AuthStack.js

移除内部的NavigationContainer,仅保留栈导航器:

import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";

import HomePage from "./HomePage";

const Stack = createNativeStackNavigator();

export default function AuthStack ({navigation}){
    return(
          <Stack.Navigator>
            <Stack.Screen
               name="Home"
               component={HomePage}
               options={{headerShown:false}}>
            </Stack.Screen>
          </Stack.Navigator>
    );
}

2. 修正UnauthedStack.js

同样移除内部的NavigationContainer:

import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";

import LoginPage from "./LoginPage";
import RegisterPage from "./RegisterPage";

const Stack = createNativeStackNavigator();

export default function UnauthedStack ({navigation}) {
   return (
        <Stack.Navigator initialRouteName="Login">
            <Stack.Screen
               name="Login"
               component={LoginPage}
               options={{headerShown: false}}>
            </Stack.Screen>
            <Stack.Screen
               name="Register"
               component={RegisterPage}
               options={{headerShown: false}}>
            </Stack.Screen>
        </Stack.Navigator>
    );
}

3. 统一状态变量名

你的AuthContext里定义的状态是loggedIn,但AppContent里用的是loggedInUser,这会导致登录状态判断失效,需要二选一统一:

方案一:修改AuthContext.js

import React from "react";

const AuthContext = React.createContext();

export const AuthProvider =({children}) => {
    const [loggedInUser, setLoggedInUser] = React.useState(null);

    return (
      <AuthContext.Provider value={{loggedInUser, setLoggedInUser}}>
        {children}
      </AuthContext.Provider>
    );
};

export const useAuth = () => React.useContext(AuthContext);
export default AuthContext;

方案二:修改App.js中的AppContent

const AppContent = () => {
  const { loggedIn } = useAuth();
  return (
    <NavigationContainer>
      {loggedIn ? <AuthStack /> : <UnauthedStack />}
    </NavigationContainer>
  );
};

关于independent={true}的补充

如果确实需要嵌套NavigationContainer(比如需要完全独立的导航状态场景),才需要在子容器上添加该属性,示例:

<NavigationContainer independent={true}>
  {/* 独立导航内容 */}
</NavigationContainer>

但你的场景是根据登录状态切换不同栈,仅需一个顶层容器即可,无需使用该属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:55:01