【问题标题】:React-navigation: nesting stack navigator and tab navigator inside switch navigator results in 2 headersReact-navigation:在 switch navigator 中嵌套堆栈导航器和选项卡导航器会产生 2 个标题
【发布时间】:2019-08-10 14:10:21
【问题描述】:

我在带有react-navigation 的 React Native 应用程序中使用了选项卡导航器、堆栈导航器和切换导航器的组合。请注意,我必须将选项卡导航器的每个屏幕都放在其自己的堆栈导航器中,以便使用内置的标题功能。

功能有效。但我最终得到了 FeedProfile 页面的 2 个标题,如下所示:

我只希望每个屏幕都有自己的标题,评论屏幕有一个后退按钮。我知道代码不是很干净,将所有这些导航器放在一起会消耗很多开销。那么实现这一目标的最佳方法是什么?

App.js

const FeedScreenStack = createStackNavigator({
  FeedStack: {
    screen: feed,
    navigationOptions: {
      headerTitle: "Feed"
    }
  }
});

const ProfileScreenStack = createStackNavigator({
  ProfileStack: {
    screen: profile,
    navigationOptions: {
      headerTitle: "My Profile"
    }
  }
})

const TabStack = createBottomTabNavigator({
  Feed: { screen: FeedScreenStack },
  Profile: { screen: ProfileScreenStack }
});

const AppStack = createStackNavigator({ 
  Tab: TabStack,
  Comments: { 
    screen: comments, 
    navigationOptions: {
      headerTitle: "Comments"
    },
  }
});

const MainStack = createSwitchNavigator(
  {
    Home: AppStack,
    Auth: AuthStack
  },
  {
    initialRouteName: 'Home'
  }
);

const AppContainer = createAppContainer(MainStack);

【问题讨论】:

    标签: reactjs react-native react-navigation stack-navigator tabnavigator


    【解决方案1】:

    尝试像这样修改 AppStack:

    已编辑:

    我忘记将它包含在导航选项中。试试看。

    const AppStack = createStackNavigator({ 
      Tab: {
        screen:TabStack,
        navigationOptions: () => ({
          headerMode: 'none',
    
          // or this
    
          header: null
         })
      },
      Comments: {
        screen: comments, 
        navigationOptions: {
          headerTitle: "Comments"
        },
      }
    },
    );
    

    【讨论】:

    • 这不起作用,因为它覆盖了Comments 的标题
    • 不起作用,仍然有 2 个标题。 headerMode:'none'header:null 无效
    【解决方案2】:

    您说您希望Comments 屏幕有自己的标题(与所有其他屏幕一样)和一个后退按钮。 具体应该回到什么位置?了解导航的结构会使设计更容易。

    让您的AppStack 实际上只是您的TabStack 会更干净。添加与TabStack 相同级别的Comments 屏幕可能无助于您的多标题问题。

    在这里,我将展示如何完全删除 AppStack 并将 Comments 嵌套在 ProfileFeed 选项卡中,具体取决于您的需要。

    const FeedScreenStack = createStackNavigator({
      FeedStack: {
        screen: feed,
        navigationOptions: {
          headerTitle: "Feed"
        }
      },
      // if you want Comments to go back to "Feed"
      Comments: { 
        screen: comments, 
        navigationOptions: {
          headerTitle: "Comments"
        },
      }
    });
    
    const ProfileScreenStack = createStackNavigator({
      ProfileStack: {
        screen: profile,
        navigationOptions: {
          headerTitle: "My Profile"
        }
      },
      // if you want Comments to go back to "Profile"
      Comments: { 
        screen: comments, 
        navigationOptions: {
          headerTitle: "Comments"
        },
      }
    })
    
    const TabStack = createBottomTabNavigator({
      Feed: { screen: FeedScreenStack },
      Profile: { screen: ProfileScreenStack }
    });
    
    const MainStack = createSwitchNavigator(
      {
        Home: TabStack,
        Auth: AuthStack
      },
      {
        initialRouteName: 'Home'
      }
    );
    
    const AppContainer = createAppContainer(MainStack);
    

    但是,如果您希望 Comments 实际上位于 ProfileFeed 之上,您应该将其设为自己的选项卡,或者将其更改为顶层的 Modal。如果这更符合您的需要,请告诉我,我可以发布更多细节!

    【讨论】:

    • 这很好,但如果我想始终在应用程序底部有标签堆栈怎么办?除非它在Auth 视图中?
    • 这就是我的应用程序的确切行为,上面的代码应该就是这样! AuthStack 上不会有标签栏,因为它与 TabStack 处于同一级别,但不在其中。所有TabStack 都会有标签(在底部),这是应用程序的其余部分。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2021-09-02
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多