How to create a Drawer Navigator in React Native using React Navigation 5

It has been a while since I have done an article, in addition, it has been a few weeks since I have programmed in React-Native and things have changed! In terms of some of the packages I use. One of those being React-Navigation, React Navigation 5 seems to be in full swing so I thought it would be cool if I wrote a tutorial to showcase how you can create a Drawer Navigator (that is the side menu) using React Navigation and how much easier it is!

Firstly, if you haven’t already you will need to create a react native project using the command.

react-native init MyRNNavigationProject

Once this has completed you will need to open the folder this command generates using your favourite code editor. I use VS Code A LOT.

Once you have done this you will need to install the main react navigation npm package using the below command

npm install @react-navigation/native

We will also need to install some dependencies that are used in conjunction with react-navigation. The command to do this is below.

npm install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view

react-native-gesture-handler — Helps manage gestures within the mobile app

react-native-reanimated — Allows for greater flexiblity and usage with the Animated API

react-native-screens — exposes native navigation components

react-native-safe-area-context — Method to handle safe areas

The next step is to ensure the components are properly linked to iOS and the info.plist file by entering each command into the terminal of your code editor

cd ios 
pod install
cd ..

Furthermore, to finish the initialization of the package ‘react-native-screens’ you need to add the below lines to the build.gradle file found in the “android/app” folder of your project.

implementation 'androidx.appcompat:appcompat:1.1.0-rc01' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'

To finish the initialization of ‘react-native-gesture-handler’ you need to add the below 3 lines to the top of the file ‘MainActivity.Java’

import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;

In addition, you need to add the below method underneath the method “getMainComponentName”

protected ReactActivityDelegate createReactActivityDelegate() { return new ReactActivityDelegate(this, getMainComponentName()) { @Override
protected ReactRootView createRootView() {
return new RNGestureHandlerEnabledRootView(MainActivity.this); }


After this has been completed you will need to install another npm package which will install the necessary drawer components

npm install @react-navigation/drawer

You will now need to import the navigation container component from react navigation

import { NavigationContainer } from '@react-navigation/native';

Navigation container is responsible for managing the app state and interlinking the top level navigator with the rest of the app code.

After importing the navigation container you will need to import the “createDrawerNavigator” component from react navigation drawer.

import { createDrawerNavigator } from '@react-navigation/drawer';

“createDrawerNavigator” is a component that renders a drawer navigator that can be opened and closed by gestures.

You will then need to create a variable that contains an instance of this component just below the import statements.

const MyDrawer = createDrawerNavigator();

The next step is to remove all of the original gobbildy goop within the “App” variable and replace it with something much simpler. Like the below

function App(){return(<NavigationContainer>

Navigation container will be at the top level and the drawer navigator will be placed within this.

Next create two separate functions that will act as screens that we can navigate 2. If you are feeling lazy you can copy and paste mine below haha

function ContactUs() {return (<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text>Contact Us</Text></View>);}function Settings() {return (<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text>Settings screen</Text></View>);}

The last thing to do is to create a function that will return a drawer navigator component and its screens

So first off write the below code

function DrawerContainer() {return ();}

Next you will need to use the variable you created earlier which is the instance of the drawer navigator that was imported i.e. since i named the variable “MyDrawer” I will be referencing the the drawer navigator using this like below. In addition, we can set an initial route name in the “navigator” so when the drawer loads it will always default to a specific route.

<MyDrawer.Navigator initialRouteName="ContactUs"></MyDrawer.Navigator>

So now your function will look like the below.

function DrawerContainer() {return (<MyDrawer.Navigator></MyDrawer.Navigator>);}

You will now need to use the “screen” component of the variable you made, the screen component will be used to a new item to the drawer component.

The “screen” component has a few props, but for this tutorial we will only 2, those are “name” and component. The name property is the text the drawer item will display when in the drawer, and the component property is the component the drawer item will navigate to when it is clicked.

You will need to reference the 2 functions you created here inside the component prop. Since I have functions called “ContactUs” and “Settings” that return a component I will reference them. So now my drawer navigator function looks like the below.

function DrawerContainer() {return (<Drawer.Navigator><Drawer.Screen name="Contact Us" component={ContactUs} /><Drawer.Screen name="Settings" component={Settings} /></Drawer.Navigator>);}

However, our job is not done, we need to insert the drawer container into our absolute top level component the “App” function. This is easily done with the below code.

function App() {return (<NavigationContainer><DrawerContainer /></NavigationContainer>);}

As you can see we have a navigation container and inside of that is the function that contains our drawer navigator that will navigate to different screens depending on what drawer item is clicked.

You then export the App component using the below code

export default App;

Now you can run the command

react-native run-ios

To open a simulator

Thank you for reading this article and I hope it sheds some light on how to use the new react navigation code to build a drawer navigator!

I’m open to suggestions on how to improve my articles in terms of content, grammar even images! So hit me up if you have some suggestions :)




Software Developer in the UK. With a keen passion for React Native & C#

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

SpringMVC ajax background cannot get object properties

React: Understanding PROPS-101

React Native Currency Formatting Done Native Way

Building professional, powerful applications with Dash Pro components

Pro FlowChart in action

How to sort imports like a pro in TypeScript

One Edit Distance Apart — Refactored. Popular WhiteBoarding Problems Explained.

Cookies vs Local Storage vs Session Storage

JavaScript: Equal !== Equality

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store


Software Developer in the UK. With a keen passion for React Native & C#

More from Medium

MVVM Pattern In React

Getting Started With Apollo Client in Your React App

How To Create A Stack Navigator In React Navigation

Patch Package