升级react-navigation v6后遇同名嵌套屏幕报错求助
问题核心
React Navigation v6对屏幕名称的唯一性要求比v5严格得多,不允许任何嵌套层级下出现同名的屏幕——哪怕是不同导航容器(抽屉、栈、标签)里的屏幕,只要名称重复就会触发Found screens with the same name nested inside one another报错。你遇到的情况就是HomeBottom同时出现在AppSideDrawerScreen > HomeSide > HomeBottom和AppSideDrawerScreen > HomeSide > HomeBottom > HomeBottom路径中,导致冲突。
具体解决步骤
1. 停止使用route.name动态生成屏幕名称
你怀疑的点是对的,用route.name作为Screen的name属性很容易导致重复。直接给每个屏幕指定全局唯一的静态名称:
// 错误写法:依赖route.name可能导致重复 <HomeStack.Screen name={route.name} component={HomeBottom} /> // 正确写法:手动指定唯一名称 <HomeStack.Screen name="HomeBottomContainer" component={HomeBottom} />
2. 检查并修改所有嵌套的同名屏幕
遍历你的导航结构,找到所有重复的屏幕名称,逐一重命名:
比如原来HomeBottom组件内部的导航可能有这样的代码:
// 错误:内部屏幕和外层容器同名 const HomeBottom = () => ( <Tab.Navigator> <Tab.Screen name="HomeBottom" component={HomeScreen} /> </Tab.Navigator> );
修改为:
// 正确:给内部屏幕指定唯一名称 const HomeBottom = () => ( <Tab.Navigator> <Tab.Screen name="HomeMainContent" component={HomeScreen} /> </Tab.Navigator> );
3. 确保所有屏幕名称全局唯一
不管是抽屉导航、栈导航还是标签导航里的屏幕,name属性必须在整个导航结构里没有重复。比如:
- 抽屉里的屏幕叫
HomeSideContainer - 栈里的容器屏幕叫
HomeBottomContainer - 标签里的内容屏幕叫
HomeMainContent
这样层级清晰且不会重名。
验证修改
完成上述调整后,重新运行应用,报错应该会消失。如果还有问题,检查导航结构的每个层级,确保没有遗漏的同名屏幕——v6会严格校验所有嵌套路径的屏幕名称唯一性。
内容的提问来源于stack exchange,提问作者remyremy
相关产品推荐
相关产品推荐

