Resetting the navigation stack for the home screen (React Navigation and React Native)

142,158

Solution 1

This is How I do it :

reset(){
    return this.props
               .navigation
               .dispatch(NavigationActions.reset(
                 {
                    index: 0,
                    actions: [
                      NavigationActions.navigate({ routeName: 'Menu'})
                    ]
                  }));
  }

at least replace 'Menu' with 'Home'. You may also want to adapt this.props.navigation to your implementation.

In version > 2 follow this:

import { NavigationActions, StackActions } from 'react-navigation';
        const resetAction = StackActions.reset({
                index: 0,
                actions: [NavigationActions.navigate({ routeName: 'MainActivity' })],
            });

this.props.navigation.dispatch(resetAction); 

Solution 2

React Navigation 5.x , 6.x

import { CommonActions } from '@react-navigation/native';

navigation.dispatch(
  CommonActions.reset({
    index: 1,
    routes: [
      { name: 'Home' },
      {
        name: 'Profile',
        params: { user: 'jane' },
      },
    ],
  })
);

Available in Snack

Solution 3

I found this way to go while using @react-navigation Bashirpour's Answer. However, while trying out Functional components where you already have navigation in props here is a neat way to write reset Stack action:

props.navigation.reset({
     index: 0,
     routes: [{ name: 'Dashboard' }]
})

Solution 4

Here is how I do it:

import { NavigationActions } from 'react-navigation'

this.props.navigation.dispatch(NavigationActions.reset({
    index: 0,
    key: null,
    actions: [NavigationActions.navigate({ routeName: 'ParentStackScreen' })]
}))

The important part is key: null.

That wipes the stack while navigating from a child navigator to a parent navigator.

Do that if you get this error:

enter image description here

For animations, I use

// https://github.com/oblador/react-native-animatable
import * as Animatable from 'react-native-animatable'

I just control all the animations myself. Put them on any component you want by wrapping it with <Animatable.View>.

Solution 5

For newest versions of react-navigation you should use StackActions for reset the stack, here's a piece of code:

// import the following
import { NavigationActions, StackActions } from 'react-navigation'

// at some point in your code
resetStack = () => {
 this.props
   .navigation
   .dispatch(StackActions.reset({
     index: 0,
     actions: [
       NavigationActions.navigate({
         routeName: 'Home',
         params: { someParams: 'parameters goes here...' },
       }),
     ],
   }))
}
Share:
142,158
Daniel
Author by

Daniel

I am the administrator of ElderScrollsPortal.de and I'm working at OPITZ CONSULTING. In my free time, I also develop smaller projects.

Updated on January 20, 2022

Comments

  • Daniel
    Daniel over 2 years

    I've got a problem with the navigation of React Navigation and React Native. It is about resetting navigation and returning to the home screen.

    I've build a StackNavigator inside of a DrawerNavigator, and the navigation between home screen and other screens is working. But the problem is, that the navigation stack grows and grows. I'm not sure how to remove a screen from the stack.

    For example when going from the home screen to the settings screen, then to the entry screen and lastly again to the home screen, the home screen is twice in the stack. With the back button I do not get out of the app, but again to the entry screen.

    When selecting the home button again a reset of the stack would be great, but I don't know how to do this. Here someone tried to help an other person with a similar problem, but the solution didn't work for me.

    const Stack = StackNavigator({
      Home: {
        screen: Home
      },
      Entry: {
        screen: Entry
      },
      Settings: {
        screen: Settings
      }
    })
    
    export const Drawer = DrawerNavigator({
      Home: {
        screen: Stack
      }},
      {
        contentComponent: HamburgerMenu
      }
    )
    

    And this is a simple example of the drawer screen

    export default class HamburgerMenu extends Component {
      render () {
        return <ScrollView>
          <Icon.Button
            name={'home'}
            borderRadius={0}
            size={25}
            onPress={() => { this.props.navigation.navigate('Home')}}>
            <Text>{I18n.t('home')}</Text>
          </Icon.Button>
    
          <Icon.Button
            name={'settings'}
            borderRadius={0}
            size={25}
            onPress={() => { this.props.navigation.navigate('Settings')}}>
            <Text>{I18n.t('settings')}</Text>
          </Icon.Button>
    
          <Icon.Button
            name={'entry'}
            borderRadius={0}
            size={25}
            onPress={() => { this.props.navigation.navigate('Entry')}}>
            <Text>{I18n.t('entry')}</Text>
          </Icon.Button>
        </ScrollView>
      }
    }
    

    I hope you can help me. This is an essential part of the navigation and a solution would be great!