【问题标题】:How to use StackNavigator with DrawerNavigator and SwitchNavigator on React Native?如何在 React Native 上使用 StackNavigator 与 DrawerNavigator 和 SwitchNavigator?
【发布时间】:2019-03-18 22:48:18
【问题描述】:

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

结构:


我有这样的屏幕结构:

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

这是我想要得到的行为:

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

• Products
|_ Product detail
 |_ Ingredients

• Configuration
• About

• Cart
|_ Checkout
 |_ Finish Checkout 

抽屉:MainDrawer with => createDrawerNavigator()

• Account
• Products
• Configuration
• About
• Cart

SwitchNavigator

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

组件:StartCheckWelcomeScreen<Component />

StartCheck:这只是检查 AsyncStorage 上是否有数据,例如 "isFirstRun",并根据 结果 [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'
    },
};

主抽屉:

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里面:

主堆栈:

const MainStack = createStackNavigator({
    MainDrawer
});

然后我用 SwitchNavigator 修改 App Container:

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

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

export default AppContainer;

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

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

而且我也不知道可以把副屏放在哪里(用 StackNavigator 的导航方法打开)。

抱歉这篇大文章,是我尽量详细,因为我一直在寻找解决方案,但我没有找到......

【问题讨论】:

  • 你试过在 DrawerNavigator 中嵌套 StackNavigators 吗?
  • 怎么样?您可以发布示例吗?

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


【解决方案1】:

我先用文字的形式描述一下我的想法:

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

  • 您的抽屉将呈现 StackNavigator 或 Pure Component|Screen。 所以,抽屉应该有这些路线:
  • 帐户堆栈 | AuthStack。
  • ProductsStack.
  • 配置屏幕。
  • 关于屏幕。
  • CheckoutStack.

一直显示标题

  • 所有 StackNavigator 都附带标题 /// 为在堆栈中呈现的屏幕完成。

  • 对于像关于屏幕这样的纯组件,您可以创建一个自定义标题并在这些组件中手动添加它。

或“我认为不推荐”

  • 在 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
    });
    

【讨论】:

  • 老兄,第二个选项有效,我在 2 年前的一个项目中使用它,我不想使用它,因为这显然是一种不好的做法,而且它似乎也不是正确的做法它,但显然它仍然是如此简单的事情的唯一解决方案。我看到几个人有同样的问题,直到今天,开发人员还没有实施任何解决这个问题的方法。还是谢谢你。
【解决方案2】:

像这样定义你的 createSwitchNavigator

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多