Why This Exists
In v3, blank stack covers the old embedded-flow use case that originally pushed people toward component stack.
The two options that matter are:
independentenableNativeScreens
They solve different problems.
independent
independent creates an isolated navigation tree for the blank stack.
Use it when the stack lives inside another screen, sheet, host app surface, or any embedded flow that should not join the parent React Navigation tree.
TSX
When independent is enabled, the navigator wraps itself in its own NavigationIndependentTree and NavigationContainer.
Leave this off for normal app-level stacks.
enableNativeScreens
enableNativeScreens controls whether blank stack renders with native screen primitives from react-native-screens or with regular views.
TSX
With the default true value, blank stack keeps react-native-screens behavior such as native activity state and freezing.
With false, blank stack renders with regular views instead of native screen primitives.
This is often the better fit for embedded flows where plain view layering behaves more naturally than native screen containers.
How They Work Together
These options are independent from each other:
independentdecides whether the stack joins the parent navigation treeenableNativeScreensdecides whether the stack uses native screen primitives
That means you can combine them:
TSX
This is the common embedded-flow setup:
- isolated navigation state
- regular view rendering
When To Use Each Setup
Default Blank Stack
Use the defaults when the stack is part of your main app navigation:
TSX
Independent Embedded Flow
Use independent when the flow must manage its own navigation state:
TSX
Embedded Flow With Regular Views
Use independent together with enableNativeScreens={false} when the flow is embedded and you want regular view layering instead of native screen primitives:
TSX
This is usually the most predictable setup for nested flows, custom containers, and surfaces where native screen layering gets in the way.
Static API
The same options are available in the static factory form:
TSX
Practical Guidance
- choose blank stack first for new work
- add
independentwhen the flow should not join the parent navigation tree - set
enableNativeScreens={false}when embedded view behavior is a better fit than native screen primitives - keep
enableNativeScreenson when you want the normalreact-native-screensbehavior inside blank stack
If you are deciding between this and component stack, choose blank stack. Component stack is now the legacy path.