React Navigation back() and goBack() not working

前提是你 提交于 2019-11-30 10:58:33

the key property for goBack() is a dynamically created string, created by react-navigation whenever navigate 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.

Why not key of Cover but EditCover?

because react-navigation only provide 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.

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 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

LeeHayng

In general we can use following two command

  1. this.props.navigation.goBack()
  2. this.props.navigation.dispatch(NavigationActions.back())

we have to use two command in another case:

  • first command useful in the project with One stacknavigator Only
  • Second Command useful in bottom navigator.

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!