Skip to main content

Install the Package

Install react-native-screen-transitions using your package manager:
npm install react-native-screen-transitions

Install Peer Dependencies

The library requires several peer dependencies to function. Install all of them:
npm install react-native-reanimated react-native-gesture-handler \
  @react-navigation/native @react-navigation/native-stack \
  @react-navigation/elements react-native-screens \
  react-native-safe-area-context

Required Versions

Ensure your peer dependencies meet these minimum version requirements:
PackageMinimum Version
react-native-reanimated≥3.16.0 or ≥4.0.0
react-native-gesture-handler≥2.16.1
@react-navigation/native≥6.0.0
@react-navigation/native-stack≥7.0.0
@react-navigation/elements≥2.0.0
react-native-screens≥4.4.0
react-native-safe-area-contextAny version
Using older versions of these dependencies may cause compatibility issues or runtime errors.

Configure React Native Reanimated

Add the Reanimated plugin to your Babel configuration:
1

Edit babel.config.js

Open your babel.config.js file and add the plugin:
babel.config.js
module.exports = {
  presets: ['module:@react-native/babel-preset'],
  plugins: [
    'react-native-reanimated/plugin',
  ],
};
The Reanimated plugin must be listed last in your plugins array.
2

Clear Metro cache

After adding the plugin, clear your Metro bundler cache:
npx react-native start --reset-cache

Configure Gesture Handler (iOS)

For iOS, wrap your app entry point with GestureHandlerRootView:

React Navigation

App.tsx
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { NavigationContainer } from '@react-navigation/native';

export default function App() {
  return (
    <GestureHandlerRootView style={{ flex: 1 }}>
      <NavigationContainer>
        {/* Your navigation setup */}
      </NavigationContainer>
    </GestureHandlerRootView>
  );
}

Expo Router

app/_layout.tsx
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { Stack } from 'expo-router';

export default function RootLayout() {
  return (
    <GestureHandlerRootView style={{ flex: 1 }}>
      <Stack>
        {/* Your screens */}
      </Stack>
    </GestureHandlerRootView>
  );
}

Optional: Masked View (for Shared Element Presets)

If you plan to use the Instagram or Apple Music shared element presets, install the masked view library:
npx expo install @react-native-masked-view/masked-view
Masked View requires native code and will not work in Expo Go. You’ll need to use a development build or EAS Build.

Verify Installation

Test your installation by creating a simple stack navigator:
import { createBlankStackNavigator } from 'react-native-screen-transitions/blank-stack';
import { View, Text } from 'react-native';

const Stack = createBlankStackNavigator();

function HomeScreen() {
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>Home Screen</Text>
    </View>
  );
}

export default function App() {
  return (
    <Stack.Navigator>
      <Stack.Screen name="Home" component={HomeScreen} />
    </Stack.Navigator>
  );
}
If this renders without errors, your installation is complete!

Next Steps

Quick Start

Create your first custom transition

API Reference

Explore all available options and components

Build docs developers (and LLMs) love