【问题标题】:React-Navigation adding drawer navigation with tabReact-Navigation 使用选项卡添加抽屉式导航
【发布时间】:2019-02-12 05:55:58
【问题描述】:

我在 expo 中使用 react-navigation ("^3.0.9")。

这是我的逻辑流程:

TabView(BottomTabNavigator) with StackNavigatior:

HomeStack
 --HomeScreen
 ...
LinksStack
 --LinkScreen
 ...
SettingsStack
-- Aboutscreen
...

一切正常,但现在我想添加一个抽屉导航(汉堡菜单),如下所示:

DrawerNavigation View
  --HomeScreen(which will show HomeScreen with 3 tabs)
  --Screen2 (no tabs)
  --Screen3 (no tabs)

我尝试执行以下操作:

export const Tab = createBottomTabNavigator({
  HomeStack,
  LinksStack,
  SettingsStack,
}
);

export const Drawer = DrawerNavigator({
  HomeScreen: { screen: HomeScreen },
  Screen2: { screen: Screen2 },
  Screen3: { screen: Screen3 },
});

他们返回的未定义错误不是函数

原来的代码是只导出默认的底部标签导航器,

//export default createBottomTabNavigator({
//   HomeStack,
//   LinksStack,
//   SettingsStack,
// }
// );

如何同时实现 BottomTabNavigator 和 DrawerNavigator?

--代码如下

调用 AppNavigator 的我的 App.js

render() {
    if (!this.state.isLoadingComplete && !this.props.skipLoadingScreen) {
      return (
        <AppLoading
          startAsync={this._loadResourcesAsync}
          onError={this._handleLoadingError}
          onFinish={this._handleFinishLoading}
        />
      );
    } else {
      return (
        <View style={styles.container}>
          {Platform.OS === 'ios' && <StatusBar barStyle="default" />}
          <AppNavigator />
        </View>
      );
    }
  }

哪个 AppNavigator 调用 MainTabNavigator

import { createAppContainer, createSwitchNavigator } from 'react-navigation';

import MainTabNavigator from './MainTabNavigator';

export default createAppContainer(createSwitchNavigator({
  Main: MainTabNavigator,
}
)); 

我的带有 Tab 的 stackNavigator 示例

const HomeStack = createStackNavigator({
  Home: HomeScreen,
  HomeDetail: HomeDetailScreen
});

HomeStack.navigationOptions = {
  tabBarLabel: 'Home',
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={
        Platform.OS === 'ios'
          ? `ios-home`
          : 'md-home'
      }
    />
  ),
};

更新: 我已经完成了正确的工作snack example,任何人都可以从中参考。

【问题讨论】:

    标签: react-native react-navigation expo


    【解决方案1】:

    您需要在 DrawerNavigator 中添加 tabNavigator。

    const ProfileNavigator = createDrawerNavigator({
      Drawer: DashboardTabNav
    }, {
      initialRouteName: 'Drawer',
      contentComponent: ExampleScreen,
      drawerWidth: 300
    
    });
    
    // Manifest of possible screens
    const PrimaryNav = createStackNavigator({
      DashboardScreen: { screen: ProfileNavigator },
      LoginScreen: { screen: LoginScreen },
      LaunchScreen: { screen: LaunchScreen },
      UpdateUserScreen: { screen: UpdateUserScreen }
    }, {
      // Default config for all screens
      headerMode: 'none',
      initialRouteName: 'LoginScreen',
      navigationOptions: {
        headerStyle: styles.header
      }
    });
    export default createAppContainer(PrimaryNav);
    

    看看how to open drawer without navigating to the screen from one of the tabs of tabnavigator? 或者 https://readybytes.in/blog/how-to-integrate-tabs-navigation-drawer-navigation-and-stack-navigation-together-in-react-navigation-v2 还有完整的例子看看https://gitlab.com/readybytes/ReactNavigationExampleVersion2

    【讨论】:

    • 嗨,我相信我的 react-navigation 是第 3 版,而不是第 2 版。
    • 这仍然有效。我正在使用"react-navigation": "3.0.0" stackoverflow.com/questions/54580896/… 这是我本周发布的。我遇到了同样的问题。然后这个回购帮助我解决了这个问题。上面的代码完全是从我的代码库中复制过来的。
    • const DashboardTabNav = createBottomTabNavigator({ Profile: { screen: ProfileScreen, navigationOptions: ({navigation}) =&gt; ({ tabBarOnPress: (tab) =&gt; { navigation.openDrawer(); } }) }, Home: Dashboard, History: SettingsScreen, Cart: CartScreen }, { defaultNavigationOptions: customTabs, animationEnabled: true, swipeEnabled: true, tabBarPosition: 'bottom', initialRouteName: 'Cart', tabBarOptions: { activeTintColor: '#6C1D7C', inactiveTintColor: 'rgba(0,0,0,0.6)', showLabel: false, }, });
    • 如果您仍然感到困惑,请在snack.expo.io 中添加一个小示例,我会帮助您编写代码。
    • 我做了一个示例小吃,以防有人想使用 expo snack.expo.io/@cjmling/react-tab-and-drawer 进行工作演示