3 回答
TA贡献1866条经验 获得超5个赞
通过互联网后,我找到了自己的方法来隐藏特定堆栈屏幕中的底部选项卡。
export default function SignStack({ navigation, route }) {
useEffect(() => {
if (route.state?.index) {
navigation.setOptions({
tabBarVisible: false,
});
} else {
navigation.setOptions({
tabBarVisible: true,
});
}
}, [navigation, route.state?.index]);
return <Stack.Navigator> ... </Stack.Navigator>
}
这将仅显示第一个堆栈屏幕上的底部选项卡。
更新 Nov 17 2020
使用隐藏底部选项卡,此示例仅在和屏幕上显示底部选项卡。getFocusedRouteNameFromRouteAuthSettings
const routeName = getFocusedRouteNameFromRoute(route) ?? 'Auth';
useEffect(() => {
navigation.setOptions({
tabBarVisible: ['Auth', 'Settings'].includes(routeName),
});
}, [navigation, routeName]);
为什么不是第一个解决方案断续器
上面的解决方案根据渲染隐藏屏幕上的底部选项卡 如果您有并行导航路线,则可以使用上述解决方案。route.state.index
假设您有两个选项卡导航 用户堆栈和主页堆栈,在用户堆栈上,您有两个屏幕 配置文件和设置,如果要隐藏设置屏幕上的底部栏,您将使用上述工作正常的解决方案 但是当您直接从主页导航到用户设置屏幕时,底部选项卡栏显示在“设置”屏幕上并隐藏在“配置文件”屏幕上, 发生这种情况是因为“设置”屏幕是 和“配置文件”屏幕是 。route.state.index01
TA贡献1802条经验 获得超5个赞
就像你提到的,如果你只希望每个堆栈中的第一个屏幕显示底部标签栏,那么我建议你使用第二种方法。创建一个基本堆栈导航器,第一个屏幕是选项卡导航器本身:
const TabScreens = ({navigation}) => { // Tab navigator with only the screens that require bottom tab bar
return (
<Tab.Navigator
initialRouteName="Home"
tabBarOptions={{
activeTintColor: '#e91e63',
}}>
<Tab.Screen
name="Home"
component={Home}
options={{
tabBarLabel: 'Home',
}}
/>
<Tab.Screen
name="Welcome"
component={Welcome}
options={{
tabBarLabel: 'Welcome',
}}
/>
</Tab.Navigator>
);
};
创建选项卡导航器后,在主渲染器中使用:
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen
name="Stack"
component={TabScreens}
/>
<Stack.Screen // Add any number of extra screens that do not require the bottom tab here
name="Other screen 1"
component={OtherScreen1} />
<Stack.Screen
name="Other screen 2"
component={OtherScreen2} />
</Stack.Navigator>
</NavigationContainer>
这样,您就不必摆弄底部选项卡组件。您还可以在基本堆栈导航器的一部分和属于 Tab 导航器的任何屏幕之间来回导航。这里唯一需要注意的是,每次导航时,除了选项卡导航器中的屏幕之外的所有屏幕都将被安装和卸载。
添加回答
举报