Nested navigation params are ignored when reusing the same params object

Author: HectortdnCreated Sep 4, 2026Updated Sep 4, 2026
Labelsbugpackage:stackneeds reproplatform:androidplatform:iospackage:native-stack

Current behavior

The navigation structure used in this example is:

RootStack
├── Home
└── Parent
    └── ChildStack
        ├── List
        └── Details

The issue occurs inside the useNavigationBuilder hook, where the nested params are checked against ConsumedParamsContext:

const route = React.useContext(NavigationRouteContext);
const consumedParams = React.useContext(ConsumedParamsContext);

const isNestedParamsConsumed =
  typeof route?.params === 'object' && route.params != null
    ? consumedParams?.has(route.params)
    : false;

const currentState = React.useContext(NavigationStateContext);

The relevant initialization logic is:

const paramsForState = isNestedParamsConsumed
  ? undefined
  : route?.params;

const stateFromParams = paramsForState
  ? getStateFromParams(paramsForState, router.type)
  : undefined;

const stateBeforeInitialization =
  stateFromParams ?? currentState;

When navigating to a screen inside a nested navigator using the same params object more than once, the first navigation works correctly, but a subsequent navigation may ignore the nested screen parameters.

For example:

const params = {  screen: 'Details',  params: {  id: 123,  }};

navigation.navigate('Parent', params);

The first navigation correctly opens Details.

After navigating away and navigating to Parent again using the same params object reference, the nested navigator may open its initial screen (List) instead of Details.

During our investigation, we identified that on the second navigation:

isNestedParamsConsumed === true
currentState === undefined

Because the params are considered already consumed, paramsForState becomes undefined. Since currentState is also undefined, there is no existing navigation state to restore, and the nested navigator falls back to its initial state.

Interestingly, creating a new object for the outer params resolves the issue:

navigation.navigate('Parent', {
  ...params,
});

A deep clone is not required; creating a new object for the outer params object is enough to make the navigation work correctly.

I also tested this behavior using other navigation methods, including navigate and push, and the same issue occurs when reusing the same params object reference.

So far, the behavior does not appear to be specific to a particular navigation method.

As part of the investigation, we also created a temporary local patch to test the behavior. The patch resolves the issue and helped us identify that the relevant condition is that currentState is undefined when the params are already considered consumed.

Expected behavior

When navigating to a parent navigator while specifying a particular screen inside its nested navigator, the navigation should respect those parameters and open the requested screen.

For example:

navigation.navigate('Parent', {
  screen: 'Details',
  params: {
    id: 123,
  },
});

Regardless of whether this navigation is happening for the first time or after a previous navigation, the expected result is for the nested navigator to navigate to Details.

The fact that the same params were previously used should not cause a new navigation to the parent navigator to simply open its initial screen when there is no existing currentState available to represent a previous navigation state.

Reproduction

""

Platform

  • Android
  • iOS
  • Web
  • Windows
  • MacOS

Packages

  • @react-navigation/bottom-tabs
  • @react-navigation/drawer
  • @react-navigation/material-top-tabs
  • @react-navigation/stack
  • @react-navigation/native-stack
  • @react-navigation/core
  • react-native-drawer-layout
  • react-native-tab-view

Environment

package version
@react-navigation/native ^7.2.2
@react-navigation/bottom-tabs ^7.15.9
@react-navigation/drawer ^7.9.8
@react-navigation/stack ^7.8.9
react-native-drawer-layout ^4.2.2
react-native-screens ~4.16.0
react-native-safe-area-context ~5.6.0
react-native-gesture-handler ~2.28.0
react-native-reanimated ~4.1.1
react-native-pager-view 6.7.1
react-native 0.81.5
expo ~54.0.33
@react-navigation/core 7.21.13

Source: react-navigation/react-navigation