DrawerNavigator 在点击每个选项时始终显示选项卡栏

2024-02-07

我试图拥有一个选项卡栏,并且每个选项卡栏都有自己的堆栈导航器。我拥有的三个选项卡是 家 轮廓 设置

我也想在抽屉里展示这三个选项。我创建了一个抽屉,但只有点击主页才会显示选项卡栏。我想显示选项卡栏,就像您按下个人资料选项卡一样,选项卡栏仍保留在那里。

这是我的代码:

const HomeStackNavigator = createStackNavigator();
export const HomeNavigator = () => {
  return (
    <HomeStackNavigator.Navigator screenOptions={defaultNavOptions}>
      <HomeStackNavigator.Screen
        name="Home"
        component={HomeScreen}
        options={homeScreenOptions}
      />
       <HomeStackNavigator.Screen
        name="Details"
        component={DetailsScreen}
        options={detailsScreenOptions}
      />
    </HomeStackNavigator.Navigator>
  );
};

const ProfileStackNavigator = createStackNavigator();
export const ProfileNavigator = () => {
  return (
    <ProfileStackNavigator.Navigator screenOptions={defaultNavOptions}>
      <ProfileStackNavigator.Screen
        name="Profile"
        component={ProfileScreen}
        options={profileScreenOptions}
      />
       <ProfileStackNavigator.Screen
        name="EditProfile"
        component={EditProfileScreen}
        options={editProfileScreenOptions}
      />
    </ProfileStackNavigator.Navigator>
  );
};

const SettingsStackNavigator = createStackNavigator();
export const SettingsNavigator = () => {
  return (
    <SettingsStackNavigator.Navigator screenOptions={defaultNavOptions}>
      <SettingsStackNavigator.Screen
        name="Settings"
        component={SettingsScreen}
        options={settingsScreenOptions}
      />
       <SettingsStackNavigator.Screen
        name="AccountDetail"
        component={AccountDetailsScreen}
        options={accountDetailsScreenOptions}
      />
    </SettingsStackNavigator.Navigator>
  );
};




const HomeTabNavigator = createBottomTabNavigator();
export const TabNavigator = () => {
  return (
    <HomeTabNavigator.Navigator screenOptions={defaultNavOptions}>
      <HomeTabNavigator.Screen
        name="Home"
        component={HomeNavigator}
        options={{
          tabBarLabel: 'Home',
          tabBarIcon: ({ color, size }) => (
            <MaterialCommunityIcons name="home" color={color} size={size} />
          ),
        }}
      />
       <HomeTabNavigator.Screen
        name="Profile"
        component={ProfileNavigator}
        options={{
          tabBarLabel: 'Profile',
          tabBarIcon: ({ color, size }) => (
            <MaterialCommunityIcons name="face-profile" color={color} size={size} />
          ),
        }}
      />
      <HomeTabNavigator.Screen
        name="Settings"
        component={SettingsNavigator}
        options={{
          tabBarLabel: 'Settings',
          tabBarIcon: ({ color, size }) => (
            <MaterialCommunityIcons name="account-settings" color={color} size={size} />
          ),
        }}
      />
    </HomeTabNavigator.Navigator>
  );
};



const AppDrawer = createDrawerNavigator();
export const Drawer = () => {
  return(
      <AppDrawer.Navigator initialRouteName="Home">
        <AppDrawer.Screen name="Home" component={TabNavigator} />
        <AppDrawer.Screen name="Profile" component={ProfileNavigator} />
        <AppDrawer.Screen name="Settings" component={SettingsNavigator} />
      </AppDrawer.Navigator>
  )
};

我的目标是始终拥有标签。仅当我们转到任何选项卡的详细信息页面时,选项卡才应隐藏。


你可以让你的TabNavigator堆栈导航器的屏幕,它是抽屉导航器的屏幕,并将自定义抽屉组件传递给抽屉导航器:

const AppDrawer = createDrawerNavigator();
const Tab = createBottomTabNavigator();
const Stack = createStackNavigator();
const HomeTabNavigator = createBottomTabNavigator();

export const TabNavigator = () => {
  return (
    <HomeTabNavigator.Navigator>
      <HomeTabNavigator.Screen
        name="Home"
        component={HomeScreen}
        options={{
          tabBarLabel: 'Home',
        }}
      />
      <HomeTabNavigator.Screen
        name="Profile"
        component={ProfileScreen}
        options={{
          tabBarLabel: 'Profile',
        }}
      />
      <HomeTabNavigator.Screen
        name="Settings"
        component={SettingsScreen}
        options={{
          tabBarLabel: 'Settings',
        }}
      />
    </HomeTabNavigator.Navigator>
  );
};

function CustomDrawerContent(props) {
  return (
    <DrawerContentScrollView {...props}>
      <DrawerItem
        label="Home"
        onPress={() => props.navigation.navigate('Home')}
      />
      <DrawerItem
        label="Profile"
        onPress={() => props.navigation.navigate('Profile')}
      />
      <DrawerItem
        label="Settings"
        onPress={() => props.navigation.navigate('Settings')}
      />
    </DrawerContentScrollView>
  );
}

function getHeaderTitle(route) {
  return getFocusedRouteNameFromRoute(route) ?? 'Home';
}

const StackNavigator = () => {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Tabs"
        component={TabNavigator}
        options={({route}) => ({
          headerTitle: getHeaderTitle(route),
        })}
      />
      <Stack.Screen name="EditProfile" component={EditProfileScreen} />
      <Stack.Screen name="Details" component={DetailsScreen} />
      <Stack.Screen name="AccountDetail" component={AccountDetailsScreen} />
    </Stack.Navigator>
  );
};

export const Drawer = () => {
  return (
    <AppDrawer.Navigator
      initialRouteName="Home"
      drawerContent={(props) => <CustomDrawerContent {...props} />}>
      <AppDrawer.Screen name="Stack" component={StackNavigator} />
    </AppDrawer.Navigator>
  );
};

function App() {
  return (
    <NavigationContainer>
      <Drawer />
    </NavigationContainer>
  );
}

您不想显示选项卡的屏幕可以放在选项卡导航器外部的堆栈导航器内。


Sources:

  • https://reactnavigation.org/docs/drawer-navigator/#providing-a-custom-drawercontent https://reactnavigation.org/docs/drawer-navigator/#providing-a-custom-drawercontent.
  • https://reactnavigation.org/docs/screen-options-resolution/#setting-parent-screen-options-based-on-child-navigators-state https://reactnavigation.org/docs/screen-options-resolution/#setting-parent-screen-options-based-on-child-navigators-state.

一定要导入DrawerItem, DrawerContentScrollView from @react-navigation/drawer and getFocusedRouteNameFromRoute from @react-navigation/native.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DrawerNavigator 在点击每个选项时始终显示选项卡栏 的相关文章

随机推荐

  • C++ 按位复制与按成员复制? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Javascript Set() 中的成员数量是否有限制?或者这是V8中的一个错误

    下面是一些简单的 Javascript 代码 它将整数重复添加到 Set 中 var i var limit 1 lt lt 24 var s new Set for i 0 i lt limit 10 i s add i if i gt
  • 关机还是不关机?在ExecutorService(Java8)中

    我试图了解执行程序服务相对于关闭的行为 文档说 除非有 shutdown 调用 否则应用程序不会终止 但在这个简单的示例中 它会在一分钟后精确退出 任何想法 Runnable r new Runnable Override public v
  • 调整阈值cros_val_score sklearn

    有没有办法设置sklearn的cross val score阈值 我训练了一个模型 然后将阈值调整为 0 22 型号如下 Try with Threshold pred proba LGBM Model predict proba X te
  • Python 3 Windows 服务仅在调试模式下启动

    我首先在中发布了答案这个帖子 https stackoverflow com questions 42586805 python 3 windows service 但不符合论坛标准 我希望这次的回答符合论坛标准 这段代码应该更加清晰易读
  • 当参数未显式传递时,默认使用 lambda 进行用户输入

    我写了下面的代码 仍然想知道它的用途 https codereview stackexchange com questions 242702 how effective is it to default to user input in c
  • Visual Studio 在调试时跳到每隔一行

    我现在尝试单步执行代码 Visual Studio 会跳过所有其他行 我知道它是每隔一个 因为当我有一个 ForEach 循环时 它会碰到在以后的迭代中跳过的行 Visual Studio 是否有任何逻辑原因跳过其他行 UPDATE 我添加
  • 如何迭代 Array.prototype 函数

    我想将所有数组函数包装在数组对象中 但在控制台中 gt gt gt Array prototype gt gt gt prototype undefined 但是当我输入时Array prototype在控制台中它显示自动完成中的所有功能
  • System.Diagnostics.Trace.WriteLine 的结果在哪里?

    在我的代码中 我使用以下命令编写了一些跟踪消息System Diagnostics Trace WriteLine 但是我可以从哪里获取消息呢 我查看了事件查看器 但没有找到它们 Are you debugging Look at the
  • 将 Google Maps JS API ImageMapType 剪辑为多边形

    如何将 Google 地图中的 MapType 剪辑为任意多边形 例如 如果我有一个自定义图像映射类型 https developers google com maps documentation javascript maptypes I
  • Typescript:调用另一个类的“方法”

    我对 java type script 很陌生 在理解它们的概念时遇到了一些困难 我想打电话给method另一个班级的 然而 到目前为止我还没有成功 export class Foo calcSomeThing parameter numb
  • 如何仅使用 javascript 更改 onclick 按钮颜色?

    我试图使用 onclick 和 getElementsByClassName 更改按钮的颜色 并想出了这样的结果 HTML
  • Android 2.3 Webview 中的希伯来字体

    我正在将一个显示希伯来语的应用程序移植到 Android 2 3 2 3 模拟器在 TextView 中正确显示字符串 但是当我尝试将字符串放入 WebView 中时 WebView 只显示乱码 这告诉我希伯来语字体在模拟器中可用 但 we
  • 执行更新时存储过程失败

    我正在使用 PHP 的 SQL Server 驱动程序连接到 SQL Server 2008 Express 现在 我正在尝试用存储过程替换所有 SELECT UPDATE 和 INSERT 语句 这对于只包含 SELECT 语句的 SP
  • 将 Ninject 2.0 与 ASP .Net 3.5 结合使用

    我正在尝试将 Ninject 2 0 与 Asp Net 3 5 Web 应用程序一起使用 以下是 DLLS 及其我正在使用的版本 Ninject dll v2 0 0 0 Ninject Extensions Logging dll v2
  • 对象作为 python 字典中的键

    我试图使用一个对象作为 python 字典中的键 但它的行为方式我不太理解 首先 我创建一个以我的对象为键的字典 package disseminators ContentType application zip http other pr
  • 如何知道下次夏令时调整时钟的时间?

    我很好奇 是否有任何方法可以找出下一次夏令时调整发生时的 UTC 日期 时间 类似于 Windows 报告的内容 参见圆圈 此信息在 Windows 中由 EnumDynamicTimeZoneInformation 函数提供 See ht
  • 从 DataRow 获取值之间的区别

    示例代码 DataTable table new DataTable insert column to table table Columns Add name insert value to table foreach DataRow r
  • 如何处理语义分割中未知类的平均交集(mIOU)?

    我实现了一个 FCN 网络来进行语义分割 我使用 Cityscapes 作为我的数据集 如您所知 Cityscapes 中有一些您在训练过程中忽略的类 它们被标记为 255 我使用加权损失来忽略未知类的损失 将未知类的损失设置为零 现在我想
  • DrawerNavigator 在点击每个选项时始终显示选项卡栏

    我试图拥有一个选项卡栏 并且每个选项卡栏都有自己的堆栈导航器 我拥有的三个选项卡是 家 轮廓 设置 我也想在抽屉里展示这三个选项 我创建了一个抽屉 但只有点击主页才会显示选项卡栏 我想显示选项卡栏 就像您按下个人资料选项卡一样 选项卡栏仍保