React Native animated bottom modal in a Native Stack Navigator
If you’re using the React Navigation library and you want to show a bottom modal you cannot use the
useCardAnimation() hook to know the state of the transition, this hook is not available in native navigators.
You can implement a gesture-aware bottom modal with a transparent background using the bare minimum:
- RN Animated API
yarn add react-native-gesture-handler
GModal in your Native Stack navigator. If you plan to have multiple modals feel free to include all of them in
<RootStack.Group>. All the
screenOptions values will automatically be passed down to all of the children.
Create a new
GModal.tsx file and let’s start with some imports.
Add a root view.
<PanGestureHandler> with an animated content view, this
<Animated.View> will be translated on Y axis using the gesture data provided by the PanGestureHandler.
Declare a variable to hold the current Y value and some functions that will be called by the PanGestureHandler.
Take a look and play a bit with this.
Let’s change the blue background, in the root view replace the
blue value with
transparent and you will see the content beneath.
If you open the modal and drag it up as much as you can, at the bottom of the modal, because it’s transparent you can see the parent’s page content.
Let’s create a new component to fix this.
This component will be placed as the last child in the root view:
Add a drop shadow for our content view so we can see the edges more clearly.
It’s cool to swipe it down to close it but we also want the modal to be dismissed if we click on the transparent background. Add a
<Pressable> to intercept some click events and link it to the already defined
One problem here. If you click on the red view, the
onPress will be called and the modal will be closed, if you don’t want this, make sure to add another
You’re pretty much done! Watch this short demo with a polished Logout Modal on Android.
Check out the full implementation here.
Feel free to write your question in the comments section bellow. 👇