Redux 中的 React-native 嵌套导航器

React-native nested navigators within Redux

我决定需要将常规的 react-nagivation 设置换成 redux 容器,主要是因为我需要跟踪登录状态等内容。

我不会说谎,因为这是我的第一个 React 导航,将其移至 redux 对我来说非常混乱,但一步一步地,我已经达到了我的基本结构可以正常工作的地步。 .. 快工作了。

我拥有的是在所有内容之上的 StackNav,主屏幕是 TabNav。屏幕加载正常,切换到该顶级 StackNav 的不同屏幕的应用程序部分工作正常。当我在该 TabNav 中从第一个选项卡切换到第二个选项卡时,我的问题就出现了。 澄清一下,我有 2 个选项卡 - 'Home' 和 'My Account'。 从主页切换到我的帐户确实看起来正在切换选项卡,但组件未正确呈现。它缺少渲染函数中的所有内容以及样式。然后,当我想切换回 'Home' 选项卡时,屏幕会滑动,就像我实际上会在顶级 StackNav 之间切换一样,而不仅仅是在选项卡之间切换。最重要的是,现在回到 'Home' 选项卡后,我在左上角有 'go back' 的选项,使用时,只需滑动到主页的 'previous' 视图,即使是同一个标签。

我在写这篇文章时感到困惑,但希望有人能够从中看出意义。这是我的代码:

顶级堆栈导航配置:

const routeConfiguration = {
  Home: { screen: HomeTabsNavigation },
  GameList: { screen: GameList },
  OfferDetails: { screen: OfferDetails },
}
const stackNavOptions = {
  initialRouteName: 'Home',
  mode: 'card',
  headerMode: 'float',
}
export const StackNavConfig = StackNavigator(routeConfiguration, stackNavOptions);

顶级 Stack Nav 组件:

const mapStateToProps = (state) => {
  return {
    navigationState: state.stackNav,
  }
}

class StackNavigation extends React.Component {
  render() {
    const { dispatch, navigationState } = this.props
    return (
      <StackNavConfig
        navigation={
          addNavigationHelpers({
            dispatch,
            state: navigationState,
          })
        }
      />
    )
  }
}

export default connect(mapStateToProps)(StackNavigation)

HomeTabs 定义为顶级 StackNav 的第一个屏幕:

const HomeTabs = TabNavigator({
  Home: { screen: HomeView },
  MyAccount: { screen: MyAccountView },
}, {
    tabBarOptions: tabBarOptions,
  });

export default HomeTabs;

HomeTabs 组件:

const mapStateToProps = (state) => {
  return {
    navigationState: state.homeTabs,
  }
}

class HomeTabsNavigation extends Component {
  render() {
    const { navigationState, dispatch } = this.props;
    return (
      <HomeTabs
        navigation={
          addNavigationHelpers({
            dispatch,
            state: navigationState,
          })
        }
      />
    );
  }
}

export default connect(mapStateToProps)(HomeTabsNavigation);

我的 Redux 商店:

const middleware = () => {
  return applyMiddleware(createLogger());
}

export default createStore(
  combineReducers({
    stackNav: (state, action) => StackNavConfig.router.getStateForAction(action, state),
    homeTabs: (state, action) => HomeTabs.router.getStateForAction(action, state),
  }),
  middleware(),
)

我的 TabNav 视图目前只显示文本,所以我不会将它们放在这里,除非它很重要,然后我当然会更新代码。 帮助! ;)

好的,我已经找到问题了。问题是我在顶级 Stack Navigator 和嵌套 Tab Navigator 中定义了相同的路由名称。

如您所见:

const routeConfiguration = {
  Home: { screen: HomeTabsNavigation },
  GameList: { screen: GameList },
  OfferDetails: { screen: OfferDetails },
}
const stackNavOptions = {
  initialRouteName: 'Home',
  mode: 'card',
  headerMode: 'float',
}
export const StackNavConfig = StackNavigator(routeConfiguration, stackNavOptions);

这里:

const HomeTabs = TabNavigator({
  Home: { screen: HomeView },
  MyAccount: { screen: MyAccountView },
}, {
    tabBarOptions: tabBarOptions,
  });

export default HomeTabs;

似乎这些路线可能在某个时候合并在一起,每当我的 Tab Nav 试图 'back' 到他的 'Home' 屏幕时,顶级 Stack Nav 接管了控制并加载它自己的 'Home' 屏幕在之前的屏幕之上,创建它的真实面目,即屏幕的堆叠视图。我已将其重命名为 'TabsHome' 并且一切正常。已解决!