【问题标题】:How to implement Drawer and TabBar in StackNavigatorStackNavigator中如何实现Drawer和TabBar
【发布时间】:2018-11-25 22:09:23
【问题描述】:

我总是使用 react-native-router-flux 进行导航,但在这个项目中,我需要使用 react-navigation,但遇到了一些麻烦。我需要在堆栈导航器中实现抽屉和 tabBar。

问题:

  1. 我使用原生库中的头文件组件,但无法打开 抽屉。
  2. 如何使用自己定制的drawer和tabBar组件?
  3. 也许我需要改变结构。我会考虑如何改进结构的任何建议。

我使用了第 3 版的 react-navigation。

我的代码:

const AppStackNavigator = createStackNavigator({
    loginFlow: { 
      screen: createStackNavigator({
        intro: { screen: Intro },
        login: { screen: Login },
        registration: { screen: Registration },
      }),
      navigationOptions: {
        header: null
        }
    },
    mainFlow: {
      screen: createStackNavigator({
        MyDrawer: createDrawerNavigator({
            Dashboard: {
                screen: Home,
              },
              first: {
                screen: first,
              },
              second: {
                screen: second
              },
              third: {
                screen: third
              },
              last: {
                screen: last
              }
        }),

        // settings: { screen: SettingsScreen },
          someTab: { 
            screen: createBottomTabNavigator({
              main: { screen: Home },
              firsrTab: { screen: Screen1 },
              secondTab: { screen: Screen2 },
              thirdTab: { screen: Screen3 },
              nextTab: { screen: Screen4 }
            }),
            navigationOptions: {
              header: null
            },
          }
  }),
    navigationOptions: {
      header: null
    }
  }
});

const AppContainer = createAppContainer(AppStackNavigator);

import React from 'react';
import { Header, Left, Icon, Right } from 'native-base';

const CustomHeader = (props) => {
    return(
        <Header>
            <Left>
                <Icon
                    name='menu'
                    onPress={() => {this.props.navigation.openDrawer()}}
                />
            </Left>
        </Header>
    )
}

export { CustomHeader }

【问题讨论】:

    标签: react-native react-navigation native-base


    【解决方案1】:

    您可能需要考虑将SwitchNavigator 用于身份验证流程而不是Stack at the top,因为它替换了路由,因此一旦您进入应用程序并访问选项卡,您就永远无法导航回登录/注册/启动画面和抽屉内堆栈/开关,您可以将抽屉包装在您的顶级导航器和抽屉内的标签。

    所以你的根导航应该是这样的。

    export default RootNavigation = createSwitchNavigator({
      LoginScreen: {screen: LoginContainer},
      Application: {screen: AppDrawer},
    });
    

    您的抽屉导航器应如下所示:

    const AppDrawer = createDrawerNavigator({
      ApplicationTab: {screen: TabBar},
      ... other screen that you might want to use in drawer navigation.
    }, {
       contentComponent : (props) => <MyCustomDrawer {...props} />
    });
    

    并且,Tab Navigator 将是,

    const TabBar = createBottomTabNavigator({
      TabScreen1: {screen: Tab1},
      ... other tabs...
    }, {
      tabBarComponent : (props) => <MyTabBar {...props} />
    });
    

    如果您将这些导航器中的每一个都放在一个文件中,请务必在 Drawer 之前声明 Tab,在 Switch 之前声明 Drawer,否则会出错。

    根据我的经验,自定义抽屉导航器非常简单且富有成效,但自定义选项卡并非如此,同样没有适当的 API 文档,社区答案也有些误导。 但是,对于正常的用例和大多数生动的用例,您可以完成您的工作而无需覆盖默认的,因为它在图标、唯物主义方面已经具有高度可操作性和可定制性,并且每个选项卡都在 onPress 上公开这也可以很容易地被覆盖。

    并且由于您作为抽屉没有从/通过标题进行操作,那么您能否确保您用于操作抽屉的 navigation 道具open closetoggle 操作是一个抽屉给的?

    【讨论】:

    • 我从我的一个项目中为您创建了一个gist,我在其中开发了自定义抽屉组件。希望这会有所帮助。
    • 另外我可以看到你在 CustomHeader 中使用了 this.props.navigation.openDrawer(),你应该使用 props.navigation.openDrawer() 并确保你正确地将 props 传递给你的 CustomHeader
    • @Hannibal 您可以发布您在哪里使用 CustomerHeader 组件的代码吗?此外,您可能想查看我在上述评论中分享的要点。它可能对您的编码风格有所帮助。
    • @surajmalviya 您好,您使用的是 react-navigation v3 吗?
    • @ArchNoob 我去看了文档,发现选项仍然存在。例如。见this。虽然我肯定会自己尝试使用 v3。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2021-10-08
    • 2020-06-14
    • 2018-11-17
    • 2021-11-17
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多