React Navigation: 使用NavigationActions.reset、goBack和getStateForAction返回到根页面。

13 浏览
0 Comments

React Navigation: 使用NavigationActions.reset、goBack和getStateForAction返回到根页面。

假设我在我的StackNavigator应用程序中导航了4个屏幕,现在我想返回到第一个屏幕。似乎有三种不同的方法可以做到这一点,它们可以导航到我想要的位置,但每种方法都有一个动画,会循环显示每个先前的屏幕。有没有一种简洁的方法从SCREEN_D导航到SCREEN_A?换句话说,当从SCREEN_D向后导航时,我不想在看到SCREEN_A之前短暂看到SCREEN_C和SCREEN_B。

三种方法如下:

1.

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

2.

const {SCREEN_B_KEY} = this.props.navigation.state.params;
this.props.navigation.goBack(SCREEN_B_KEY);

3.

const defaultGetStateForAction = Navigation.router.getStateForAction;
Navigation.router.getStateForAction = (action, state) => {
  if(action.type === "Navigation/BACK"){
    const routes = [
      {routeName: 'First'},
    ];
    return {
      ...state,
      routes,
      index: 0,
    };
  }
  return defaultGetStateForAction(action, state);
};

0
0 Comments

问题的出现的原因:在React Navigation中,当我们导航到其他屏幕后,有时候我们希望能够返回到根屏幕,但是默认的导航行为并不会直接返回到根屏幕,而是返回到上一个屏幕。这可能会导致一些导航问题和不必要的屏幕堆叠。

解决方法:使用NavigationActions.reset、goBack和getStateForAction等方法来实现返回到根屏幕的导航行为。下面是一个解决方法的示例代码:

import { NavigationActions } from 'react-navigation';
// 返回到根屏幕
const backToRoot = NavigationActions.reset({
  index: 0,
  actions: [NavigationActions.navigate({ routeName: 'RootScreen' })],
});
// 在需要返回到根屏幕的地方调用该方法
this.props.navigation.dispatch(backToRoot);

这段代码使用了NavigationActions.reset方法来重置导航状态,并将索引设置为0,以保证返回到根屏幕。actions属性是一个包含了返回到根屏幕所需的导航操作的数组。

另外,如果我们只是想返回到上一个屏幕,可以使用goBack方法:

// 返回到上一个屏幕
this.props.navigation.goBack();

而getStateForAction方法可以用来自定义导航行为。通过重写该方法,我们可以实现自定义的导航逻辑。

希望这些解决方法对你有帮助!如果有其他关于React Navigation的问题,可以参考官方文档:https://reactnavigation.org/docs/getting-started.html

0
0 Comments

React Navigation 提供了一个方法 popToTop() 来返回到栈中的顶部路由,关闭其他所有屏幕。但是有用户反馈这个方法在某些情况下无效,提示 navigation 未定义。解决方法是检查 navigation 是否已定义。

0
0 Comments

使用Navigation prop的popToTop方法可以实现这一功能。另外,如果你正在使用redux,你应该更新你的Redux集成。

希望这可以帮助到你!

0