React-navigation 如何将 StackNavigator 放入 TabRouter 屏幕

React-navigation How to put StackNavigator in TabRouter screen

我在使用 react-navigation 时遇到了一些问题。我想要一个自定义标签栏,其中一个屏幕由 StackNavigator.

组成

所以基本上,我有

Tab
  -- StackNavigator
     -- Dashboard (main)
     -- Wallet
     -- Etc...
  -- Other tabs...

为了制作我的自定义标签,我使用了 TabRoutercreateNavigationContainercreateNavigator

const Tabs = TabRouter(
  {
    Main: {
      screen: Main,
    },
  },
  {
    initialRouteName: 'Main',
    tabBarComponent: TabView.TabBarBottom,
    swipeEnabled: false,
    animationEnabled: false,
    backBehavior: 'none',
  },
);

const CustomTabView = ({ router, navigation }) => {
  const { routes, index } = navigation.state;
  const ActiveScreen = router.getComponentForState(navigation.state);
  return (
    <View style={{ flex: 1 }}>
      <ActiveScreen
        navigation={addNavigationHelpers({
          ...navigation,
          state: routes[index],
        })}
      />
      <View style={styles.tabContainer}>
        {routes.map(route => (
          <TouchableOpacity                          // custom tab items
            key={route.routeName}
            onPress={() => navigation.navigate(route.routeName)}
          >
            <TabItem />

          </TouchableOpacity>
        ))}
      </View>
    </View>
  );
};

const TabBar = createNavigationContainer(createNavigator(Tabs)(CustomTabView));

主要是:

const Main = StackNavigator({
  Dashboard: Dashboard,
  Wallet: Wallet,
  ...
}, { initialRouteName: 'Dashboard' });

但这不是因为 Dashboard 必须声明一个屏幕。

我做错了什么?我不知道。我们如何将 StackNavigator 放在 TabBar 屏幕中?

幸运的是,这很容易。

StackNavigator(或任何其他导航器)returns 是 React 组件。这意味着您可以将它用作任何其他路由的 screen 组件。

因此,您的路线之一 screen 将是 StackNavigator

示例代码

const Tabs = TabNavigator(
  {
    Main: {
      screen: StackNavigator({
        Dashboard: {
          screen: Dashboard,
        }
        Wallet: {
          screen: Wallet,
        }
      }),
    },
  },
  {
    initialRouteName: 'Main',
    tabBarComponent: TabView.TabBarBottom,
    swipeEnabled: false,
    animationEnabled: false,
    backBehavior: 'none',
  },
);