Skip to main content
React Native Screen Transitions provides three navigator types with different trade-offs.

Blank Stack

Blank stack is the default recommendation.
import { createBlankStackNavigator } from "react-native-screen-transitions/blank-stack";

const Stack = createBlankStackNavigator();

<Stack.Navigator>
  <Stack.Screen name="Home" component={HomeScreen} />
  <Stack.Screen
    name="Detail"
    component={DetailScreen}
    options={{
      screenStyleInterpolator: ({ progress }) => {
        "worklet";
        return {
          contentStyle: {
            opacity: interpolate(progress, [0, 1, 2], [0, 1, 0]),
          },
        };
      },
    }}
  />
</Stack.Navigator>
Best for:
  • custom interpolators
  • gestures
  • snap sheets
  • overlays
  • bounds animations

Native Stack

Native stack is the integration path for @react-navigation/native-stack.
import { createNativeStackNavigator } from "react-native-screen-transitions/native-stack";

const Stack = createNativeStackNavigator();

<Stack.Navigator screenOptions={{ enableTransitions: true }}>
  <Stack.Screen name="Home" component={HomeScreen} />
  <Stack.Screen
    name="Detail"
    component={DetailScreen}
    options={{
      ...Transition.Presets.SlideFromBottom(),
    }}
  />
</Stack.Navigator>
Use native stack when native-stack integration is the priority. Use blank stack when transition control is the priority.

Component Stack

Component stack is now the legacy path. It still creates an isolated internal navigation tree, but blank stack now covers the embedded-flow use case more cleanly on main.
import { createComponentStackNavigator } from "react-native-screen-transitions/component-stack";

const Stack = createComponentStackNavigator();

function EmbeddedNav() {
  return (
    <Stack.Navigator initialRouteName="Home">
      <Stack.Screen name="Home" component={HomeScreen} />
      <Stack.Screen name="Detail" component={DetailScreen} />
    </Stack.Navigator>
  );
}
Use component stack only when you are maintaining older embedded flows that already depend on it. For new work, prefer blank stack.

Comparison

FeatureBlank StackNative StackComponent Stack
Custom animations✅ Full control✅ Full control✅ Full control
Presets✅ Available✅ Available✅ Available
Gesture support✅ Full⚠️ More constrained✅ Full
Deep linking✅ Yes✅ Yes❌ No
Native-stack integration❌ No✅ Yes❌ No
Embedded flows✅ Preferred⚠️ Rarely the best fit⚠️ Legacy path
Recommendation✅ DefaultUse when neededAvoid for new work

Recommendation

Start with blank stack. Move to native stack only when you specifically need native-stack behavior. Treat component stack as a legacy compatibility path, not the default architecture.