React Navigation V5 Hide Bottom Tabs

后端 未结 8 1453
轻奢々
轻奢々 2021-01-05 06:35

I would like to be able to hide the tabs on a screen using React Native Navigation v5.

I\'ve been reading the documentation but it doesn\'t seem like they\'ve update

相关标签:
8条回答
  • 2021-01-05 06:52
    import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; // version 5.6.1
    import { createStackNavigator } from "@react-navigation/stack"; // version 5.6.2
    

    From my inspection navigation.routes.state.index will have a value when you navigation/push to a second screen so I create a function

    const shouldTabBarVisible = (navigation) => {
      try {
        return navigation.route.state.index < 1;
      } catch (e) {
        return true;
      }
    };
    

    and call it in BottomTab.Screen options

    <BottomTab.Navigator
        initialRouteName='Home'
        tabBarOptions={{
            activeTintColor: "#1F2B64",
            showLabel: false,
        }}
    >
        <BottomTab.Screen
            name='Home'
            component={HomeNavigator}
            options={(navigation) => ({
                tabBarIcon: ({ color }) => <TabBarIcon name='home' color={color} />,
                tabBarVisible: shouldTabBarVisible(navigation),
            })}
        />
    </BottomTab.Navigator>
    
    0 讨论(0)
  • 2021-01-05 06:53

    Let's suppose that you want to hide tabs when you are entering Settings. Just add navigation in your constructor:

    function SettingsStackScreen({ navigation ) {
        navigation.setOptions({ tabBarVisible: false })
        return (
            <SettingsStack.Navigator>
                <SettingsStack.Screen name="Settings" component={SettingsScreen} />
            </SettingsStack.Navigator>
        )
    }
    

    This code should work.

    0 讨论(0)
  • 2021-01-05 06:53

    I had this issue and couldn't find solution even in official docs ( the issues in github resulted to broken links) after some trials and research I found a solution for me To make it happen from the bottom tab navigator component

    <Tab.Navigator tabBarOptions={stackOptions} >
      <Tab.Screen
        name={"market"}
        component={MarketNavigator}
        options={navigation => ({
          // tabBarIcon: ,
          tabBarVisible: navigation.route.state.index > 0 ? false : true
        })}
      />
    </Tab.Navigator>
    

    Hope it helps someone!

    0 讨论(0)
  • 2021-01-05 06:59

    You have API reference exactly for this. Read: tabBarVisible

    0 讨论(0)
  • 2021-01-05 06:59

    The above answer will help you to remove the bottom tabs from the root navigation.If you want to remove bottom tabs from a specific screen like Home Screen or Settings Screen you need to change navigation options dynamically.

    For changing navigation options dynamically you will need the concept of:

    • React.Context
    • useNavigationState

    Context - will dynamically change the navigationOption value i.e. either to hide the bottom Tabs or not. We can choose MobX or Redux to do the same.

    UseNavigationState - will help context to know at which screen the user is.

    We need to create Context in a separate .js file so that Home.js and Settings.js can access it in all the other screens.

    import * as React from 'react';
    import { View, Text } from 'react-native'
    import { NavigationContainer, useNavigationState, useRoute } from '@react-navigation/native';
    const Tab = createBottomTabNavigator();
    const Context = React.createContext();
    
    import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
    import { createStackNavigator } from '@react-navigation/stack';
    import { TouchableOpacity } from 'react-native-gesture-handler';
    
    
    const SettingsStack = createStackNavigator();
    const ProfileStack = createStackNavigator();
    
    function SettingsScreen({ navigation }) {
      return (
        <View>
          <Text>
            Setting
          </Text>
        </View>
      );
    }
    
    function Home({ navigation }) {
      const rout = useNavigationState(state => state);
      const { screen, setScreen } = React.useContext(Context);
      setScreen(rout.index);
      return (
        <View>
          <TouchableOpacity
            onPress={() => {
              navigation.navigate("Settings");
            }}
          >
            <Text>
              Home
            </Text>
          </TouchableOpacity>
        </View>
      );
    }
    
    function SettingsStackScreen({ navigation }) {
      return (
        <SettingsStack.Navigator>
          <SettingsStack.Screen name="Settings" component={SettingsScreen} />
        </SettingsStack.Navigator>
      )
    }
    
    function ProfileStackScreen({ navigation }) {
      const { screen, setScreen } = React.useContext(Context)
      if (screen == 0) {
        navigation.setOptions({ tabBarVisible: true })
      } else {
        navigation.setOptions({ tabBarVisible: false })
      }
      return (
        <ProfileStack.Navigator>
          <ProfileStack.Screen name="Home" component={Home} />
          <ProfileStack.Screen name="Settings" component={SettingsScreen} />
        </ProfileStack.Navigator>
      )
    }
    
    function BottomNav({ navigation }) {
      return (
        <Tab.Navigator>
          <Tab.Screen name="Home" component={ProfileStackScreen} />
          <Tab.Screen name="Settings" component={SettingsStackScreen} />
        </Tab.Navigator>
      );
    }
    
    
    export default function App() {
      const [screen, setScreen] = React.useState(0);
    
      return (
        <Context.Provider value={{ screen, setScreen }}>
          <NavigationContainer>
            <BottomNav />
          </NavigationContainer>
        </Context.Provider>
      );
    }
    

    Here the screen is a flag that checks the index of the navigation and removes the bottom navigation for all the screen stacked in ProfileStackScreen.

    0 讨论(0)
  • 2021-01-05 07:01

    Use You Looking for Nested Screen Visible then Tab Bar Options Should be hide than Use this Simple Condition in StackNavigator Funtions.

      function HistoryStack({navigation, route}) {
    if (route.state.index === 0) {
     navigation.setOptions({tabBarVisible: true});
     } else {
     navigation.setOptions({tabBarVisible: false});
    }
    return (
    <Historys.Navigator initialRouteName={Routes.History}>
      <Historys.Screen
        name={Routes.History}
        component={History}
        options={{headerShown: false}}
      />
      <Historys.Screen
        name={Routes.HistoryDetails}
        component={HistoryDetails}
        options={{headerShown: false}}
      />
    </Historys.Navigator>
      );
    }
    
    0 讨论(0)
提交回复
热议问题