如何在React Native上将StackNavigator与DrawerNavigator和SwitchNavigator一起使用?

时间:2019-03-18 22:48:18

标签: javascript react-native react-navigation react-navigation-stack react-navigation-drawer

TL; DR :我需要这个结果(下面列出了DrawerNavigator和StackNavigator导航):

enter image description here

结构:


我有这种屏幕结构:

在根页面(由“•”表示)中,我需要使用 DrawerNavigator 进行导航,而子页面(由“ | _”表示)需要与 StackNavigator

这是我想要得到的行为:

• Account
|_ Create Account
|_ Login
|_ Forget Password

• Products
|_ Product detail
 |_ Ingredients

• Configuration
• About

• Cart
|_ Checkout
 |_ Finish Checkout 

抽屉: MainDrawer ,带有=> createDrawerNavigator()

• Account
• Products
• Configuration
• About
• Cart

SwitchNavigator

Start: StartCheck, // Screen component
App: MainDrawer, // Drawer
Welcome: WelcomeScreen, // Screen component

组件: StartCheck WelcomeScreen <Component />

  

StartCheck:这只是检查AsyncStorage上是否有数据,例如   “ isFirstRun”,然后根据以下内容打开 WelcomeScreen MainDrawer   结果 [like this documentation]

我的代码:


屏幕:

const Screens = {
    account: {
        screen: AccountScreen,
        path: 'account'
    },
    products: {
        screen: ProductsScrren,
        path: 'products'
    },
    configuration: {
        screen: ConfigurationScrren,
        path: 'configuration'
    },
    about: {
        screen: AboutScrren,
        path: 'about'
    },
    cart: {
        screen: CartScrren,
        path: 'cart'
    },
};

MainDrawer:

const MainDrawer = createDrawerNavigator({
    ...Screens
}, {
    contentComponent: Sidebar,
    initialRouteName: 'products',
});

带有SwitchNavigator的应用容器:

const AppContainer = createAppContainer(createSwitchNavigator(
    {
        StartCheck: StartCheck, // Component

        App: MainDrawer, // Drawer
        Welcome: WelcomeScreen, // Component
    },
    {
        initialRouteName: 'StartCheck',
    }
));

export default AppContainer;

使用此代码,不会出现 Header ,因此我将DrawerNavigator放在StackNavigator中:

MainStack:

const MainStack = createStackNavigator({
    MainDrawer
});

然后我用SwitchNavigator修改应用容器:

const AppContainer = createAppContainer(createSwitchNavigator(
    {
        StartCheck: StartCheck, // Component

        App: MainStack, // Stack
        Welcome: WelcomeScreen, // Component
    },
    {
        initialRouteName: 'StartCheck',
    }
));

export default AppContainer;

但是通过这种方式,标题会重叠侧边栏,并且如果我使用headerMode: 'none',我的标题也会从其他屏幕上消失(不仅仅是容器)。

enter image description here

我需要这个结果(使用上面的DrawerNavigator和StackNavigator导航列表):

enter image description here

而且我也不知道可以在哪里放置辅助屏幕(使用StackNavigator的导航方法打开)。

对不起,我一直在寻找尽可能多的细节,因为我一直在寻找解决方案,但是我没有找到...

2 个答案:

答案 0 :(得分:1)

我将首先以文字形式描述我的想法:

完成“开始”屏幕后,您将进入抽屉导航器,即您的根节点

  • 您的抽屉将呈现StackNavigator或Pure Component | Screen。 因此,抽屉应具有以下路线:
  • AccountStack | AuthStack。
  • ProductsStack。
  • 配置屏幕。
  • 关于屏幕。
  • CheckoutStack。

完全显示标题

  • 所有StackNavigator都附带标头///,用于在堆栈内渲染的屏幕。

  • 对于诸如About屏幕之类的纯组件,您可以创建一个自定义标题并将其手动添加到这些组件中。

或“从我的角度来看不推荐”

  • 在堆栈导航器中呈现每个纯屏幕(如“关于”屏幕)只是为了节省您创建自定义标题的时间。

    const MainDrawer = createDrawerNavigator({
      Account: AccountStack,
      Product: ProductsStack,
      Configuration: ConfigScreen, // Pure Component
      About: AboutScreen, // Pure Component
      Cart: CartStack
    });
    
    // Ex stack:
    const AccountStack = createStackNavigator({
      CreateAcount: SignUpScreen,
      Login: LoginScreen,
      ForgotPassword: ForgotPasswordScreen
    });
    

答案 1 :(得分:0)

像这样定义您的createSwitchNavigator

const AppContainer = createAppContainer(createSwitchNavigator(
    {
        StartCheck: StartCheck, // Component

        App: MainStack, // Stack
        Welcome: WelcomeScreen, // Component
    },
    {
        initialRouteName: 'StartCheck',
        headerMode: 'none',
    }
));