DEV Community

Cover image for Stack Screen + Bottom Tab Navigation + Stack Screen
Luiz Gabriel
Luiz Gabriel

Posted on

Stack Screen + Bottom Tab Navigation + Stack Screen

Working with several navigations mixed together.

Introduction

In this article we will present how to work with the merging of different types of navigation. In this project we will implement the following scenario:

  • User starts on a screen with stack screen navigation, goes to one with tab navigation and when clicking on any button within the tab navigation component will be moved to stack screen

Implementation

Step 1: Installing the libraries

  • use the package manager of your choice
yarn add @react-navigation/native

npx expo install react-native-screens react-native-safe-area-context

yarn add @react-navigation/bottom-tabs

yarn add @react-navigation/native-stack

Enter fullscreen mode Exit fullscreen mode

Step 2: Structure Project

├── src
│   ├── routes
│   │   ├── groupScreen.routes.tsx
│   │   ├── index.tsx
│   │   ├── navigation.types.ts
│   │   ├── stack.route.tsx
│   │   └── tab.route.tsx
│   └── screens
│       ├── ScreenOne
│       │   └── index.tsx
│       └── Tabs
│           ├── GroupTabs
│           │   ├── TabThree
│           │   │   └── index.tsx
│           │   └── TabTwo
│           │       └── index.tsx
│           └── TabOne
│               └── index.tsx
├── app.tsx

Enter fullscreen mode Exit fullscreen mode

Step 3: Configuring route files

  • Create a folder routes

Config React Navigation

  • Create the route file that encompasses all the others
import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import StackMainRoutes from './stack.route';

export default function Routes() {
  return (
    <NavigationContainer>
      <StackMainRoutes/>
    </NavigationContainer>
  );
}
Enter fullscreen mode Exit fullscreen mode
  • Go to app.tsx and place the routes component there
import React from 'react';
import Routes from './src/routes';

export default function App() {
  return (
    <Routes/>
  );
}
Enter fullscreen mode Exit fullscreen mode

Start by creating the navigation that appears first

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

import TabRoutes from "./tab.route";
import ScreenOne from "../screens/ScreenOne";

export default function StackMainRoutes(){
    const Stack = createNativeStackNavigator();

    return (
        <Stack.Navigator 
            initialRouteName="screenOne"
            screenOptions={{ 
                headerShown: false, 
                gestureEnabled: false, 
            }}
        >
            <Stack.Screen name="screenOne" component={ScreenOne}/>
            <Stack.Screen name="tabRoutes" component={TabRoutes}/>
        </Stack.Navigator>
    )
}
Enter fullscreen mode Exit fullscreen mode

Create the bottom tab navigation configuration file

  • With the routes file configured, you will call the tab routes navigation within StackMainRoutes
  • In the tabThree screen, the tabBar will be hidden, we'll use this getFocusedRouteNameFromRoute function to apply the screen check.
import React from "react";

import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import TabOne from "../screens/Tabs/TabOne";
import StackGroupRoutes from "./groupScreen.routes";
import { getFocusedRouteNameFromRoute } from "@react-navigation/native";

export default function TabRoutes(){
    const Tab = createBottomTabNavigator()

    return (
        <Tab.Navigator 
        screenOptions={({ route }) => ({
            headerShown: false,
            tabBarStyle: ((route) => {
                const routeName = getFocusedRouteNameFromRoute(route) ?? '';
                if (routeName === 'tabThree') {
                  return { display: 'none' };
                }
              })(route),
            tabBarShowLabel: false
          })}
        >
            <Tab.Screen name="groupScreen" component={StackGroupRoutes} options={{ title: "Group Tab" }}/>
            <Tab.Screen name="tabOne" component={TabOne} options={{ title: "Tab One" }}/>
        </Tab.Navigator>
    )
}

Enter fullscreen mode Exit fullscreen mode

Create the internal tab navigation screen group

  • In this code below, the stack screen navigation of one of the navigations tabs is configured

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

import TabTwo from "../screens/Tabs/GroupTabs/TabTwo";
import TabThree from "../screens/Tabs/GroupTabs/TabThree";

export default function StackGroupRoutes(){
    const Stack = createNativeStackNavigator();

    return (
        <Stack.Navigator
            initialRouteName="user"
            screenOptions={{ 
                headerShown: false, 
                gestureEnabled: false, 
            }}
        >
            <Stack.Screen name="tabTwo" component={TabTwo}/>
            <Stack.Screen name="tabThree" component={TabThree}/>
        </Stack.Navigator>
    )
}
Enter fullscreen mode Exit fullscreen mode

Link GitHub Repository

Repository github

Top comments (0)