I'm trying to go back two screens. The goal is to go from EditPage
to Cover
. Here is my navigation stack:
Main -> Cover -> EditCover -> EditPage
I read the docs and it says to supply a key of the screen you want to go back from, here's my code:
this.props.navigation.dispatch(NavigationActions.back({key: 'EditCover'}));
I've also tried (with no luck):
this.props.navigation.dispatch(NavigationActions.back('EditCover'));
this.props.navigation.dispatch(NavigationActions.back({key: 'EditCover'}));
this.props.navigation.dispatch(NavigationActions.back({routeName: 'EditCover'}));
this.props.navigation.goBack('EditCover');
this.props.navigation.goBack({key: 'EditCover'});
this.props.navigation.goBack({routeName: 'EditCover'});
The funny thing about all this is that I get no errors. Nothing happens when the code is called...
P.S. If I want to just go back one screen, this code works fine:
this.props.navigation.goBack(null);
P.S.S. In case someone comes across this before there is a solution. This hack works for now:
this.props.navigation.goBack(null);
this.props.navigation.goBack(null);
To go back to the previous page, pass -1 as a parameter to the navigate() function, e.g. navigate(-1) . Calling navigate with -1 is the same as hitting the back button. Similarly, you can call the navigate function with -2 to go 2 pages back.
To make this work, you need to: Disable the swipe gesture for the screen ( gestureEnabled: false ). Override the native back button in the header with a custom back button ( headerLeft: (props) => <CustomBackButton {... props} /> ).
The key
property for goBack()
is a dynamically created string, created by react-navigation
whenever it navigates to a new route.
for example:
It is stored in this.props.navigation.state.key
.
So if you want to go from EditPage
to Cover
, what you have to do is to pass the key of EditCover
down to EditPage
, and then call goBack()
with the key.
Cover
but EditCover
?Because react-navigation only provides the method goBack(key)
, it's go back from key, not go back to key.
Optionally provide a key, which specifies the route to go back from. By default, goBack will close the route that it is called from. If the goal is to go back anywhere, without specifying what is getting closed, call
.goBack(null);
EditCover.js
render() {
const { state, navigate } = this.props.navigation;
return (
<View>
<Button title="Go to Page" onPress={ () => {
/* pass key down to *EditPage* */
navigate('EditPage', { go_back_key: state.key });
}} />
</View>
);
}
EditPage.js
render() {
const { state, goBack } = this.props.navigation;
const params = state.params || {};
return (
<View>
<Button title="Back to Cover" onPress={ () => {
/* go back from *EditCover* to *Cover* */
goBack(params.go_back_key);
}} />
</View>
);
}
The right way to do this is with StackNavigation:
const AppNavigator = createStackNavigator({
Main: {screen: MainScreen},
Cover: {screen: CoverScreen},
EditCover: {screen: EditCoverScreen},
EditPage: {screen: EditPageScreen},
}, {
initialRouteName: 'Main'
});
class App extends React.Component {
render() {
return <AppNavigator/>;
}
}
According to your question, this is the order of your screens navigation, so when you goBack(null) if you are in
EditPage (goBack) -> EditCover (goBack) -> Cover (goBack) -> Main
You have to call goBack(null) like this in the components:
this.props.navigation.goBack(null);
This is the right way.
In general we can use following two command
this.props.navigation.goBack()
this.props.navigation.dispatch(NavigationActions.back())
we have to use two command in another case:
In that case, One Tab of Bottom navigator will have some screen. So Between a navigation of any tab and a navigation of another Tab, you can use second command.
For new version react-navtigation you can use StackActions
As following:
import { StackActions } from "react-navigation";
const popAction = StackActions.pop({n: 1});
this.props.navigation.dispatch(popAction);
This will return you back to the parent screen
For React navigation 2 onward you can use
this.props.navigation.dispatch(NavigationActions.back())
Also do not forgot to mention in every stacknavigator
initialRouteName: 'Posts'
For react native navigation v6 this works for me:
import { CommonActions } from '@react-navigation/native';
navigation.dispatch(CommonActions.goBack());
https://reactnavigation.org/docs/navigation-actions
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With