首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从堆栈导航器反应导航5隐藏标签栏

从堆栈导航器反应导航5隐藏标签栏
EN

Stack Overflow用户
提问于 2020-02-11 20:42:30
回答 8查看 46.3K关注 0票数 27

我想知道如何将底部选项卡条隐藏在我的堆栈导航器中的特定屏幕中,该屏幕嵌套在物质底部选项卡栏上。

这是我的堆栈导航器的代码

代码语言:javascript
复制
import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import PondScreen from '../screens/PondScreen/PondScreen';
import PondDetailScreen from '../screens/PondScreen/PondDetailScreen';

const Stack = createStackNavigator();

export function PondStack() {
  return (
    <Stack.Navigator
      initialRouteName="PondScreen"
      headerMode="none"
      mode="card"
    >
      <Stack.Screen
        name="PondScreen"
        component={PondScreen}
      />
      <Stack.Screen
        name="PondDetailScreen"
        component={PondDetailScreen}
        options={{
          tabBarVisible: false
        }}
      />
    </Stack.Navigator>
  );
}

这是我的材料底部标签导航器的代码。

代码语言:javascript
复制
import React from 'react';
import { View } from 'react-native';
import { createMaterialBottomTabNavigator } from '@react-navigation/material-bottom-tabs';
import { Entypo, Feather } from '@expo/vector-icons';
import { PondStack } from './StackNavigators';
import StockScreen from '../screens/StockScreen';
import OrderScreen from '../screens/OrderScreen';
import SettingsScreen from '../screens/SettingsScreen';

const Tab = createMaterialBottomTabNavigator();

export default function BottomTab() {
  return (
    <Tab.Navigator
      labeled={false}
      initialRouteName="Pond"
      activeColor="#EB3349"
      inactiveColor="#888888"
      backBehavior="none"
      shifting={true}
      barStyle={{
        backgroundColor: '#FFFFFF'
      }}
    >
      <Tab.Screen
        name="Pond"
        component={PondStack}
        options={{
          tabBarIcon: ({ color}) => (
            <View style={{ flex: 1 }}>
              <Entypo name="air" color={color} size={20} />
            </View>
          )
        }}
      />
      <Tab.Screen
        name="Stock"
        component={StockScreen}
        options={{
          tabBarIcon: ({ color }) => (
            <View style={{ flex: 1 }}>
              <Feather name="box" color={color} size={20} />
            </View>
          )
        }}
      />
      <Tab.Screen
        name="Order"
        component={OrderScreen}
        options={{
          tabBarIcon: ({ color}) => (
            <View style={{ flex: 1 }}>
              <Feather name="dollar-sign" color={color} size={20} />
            </View>
          )
        }}
      />
      <Tab.Screen
        name="Settings"
        component={SettingsScreen}
        options={{
          tabBarIcon: ({ color}) => (
            <View style={{ flex: 1 }}>
              <Feather name="settings" color={color} size={20} />
            </View>
          )
        }}
      />
    </Tab.Navigator>
  )
}

我目前正在使用世博会来建设我的项目。

我的依赖关系(package.json)

代码语言:javascript
复制
{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "@react-native-community/masked-view": "^0.1.5",
    "@react-navigation/material-bottom-tabs": "^5.0.0",
    "@react-navigation/native": "^5.0.0",
    "@react-navigation/stack": "^5.0.0",
    "@types/react-native": "^0.61.12",
    "expo": "~36.0.0",
    "react": "~16.9.0",
    "react-dom": "~16.9.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz",
    "react-native-gesture-handler": "~1.5.0",
    "react-native-paper": "^3.6.0",
    "react-native-raw-bottom-sheet": "^2.0.6",
    "react-native-reanimated": "~1.4.0",
    "react-native-safe-area-context": "0.6.0",
    "react-native-screens": "2.0.0-alpha.12",
    "react-native-vector-icons": "^6.6.0",
    "react-native-web": "~0.11.7"
  },
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "babel-preset-expo": "~8.0.0"
  },
  "private": true
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2020-03-26 13:17:13

作为父级的选项卡导航和作为childs的堆栈导航几乎都有相同的问题,重新安排屏幕层不是一种选择。因此,我寻找了另一个解决方案,从文档中我发现父导航UI总是显示在子导航界面上。但是,文档也给出了一个很好的例子,说明如何从子节点中更改父标头。因此,我以这个例子为例,并将其实现为选项卡的可见性。我就是这样实现的。

所以我有一个带有Home、Contact和更多的选项卡导航,在每个选项卡中我都有一个堆栈。我隐藏选项卡的屏幕在CameraView中,该屏幕是More选项卡中的堆栈屏幕。

  • 首页
  • 联系人
  • 更多
    • 配置文件
    • CameraView (在这里,我想隐藏选项卡)

Tabnavigation:

如您所见,我从一个方法中获得了该选项卡的可见性。

代码语言:javascript
复制
<NavigationContainer>
  <Tab.Navigator>
    <Tab.Screen name="Home" component={HomeNavigation} />
    <Tab.Screen name="Contacts" component={ContactNavigation} />
    <Tab.Screen
      name="More"
      component={MoreNavigation}
      options={({ route }) => ({
        tabBarVisible: this.getTabBarVisibility(route)
      })}
    />
  </Tab.Navigator>
</NavigationContainer>

方法getTabBarVisibility:

这就是我检查路由的名称是否是CameraView,这是我在StackNavigation中定义的。

代码语言:javascript
复制
getTabBarVisibility = (route) => {
  const routeName = route.state
    ? route.state.routes[route.state.index].name
    : '';

  if (routeName === 'CameraView') {
    return false;
  }

  return true;
}

和组件MoreNavigation:

这是我的堆栈导航,在这里您可以看到屏幕名是CameraView。

代码语言:javascript
复制
<Stack.Navigator initialRouteName="More">
  <Stack.Screen name="More" component={More}/>
  <Stack.Screen name="UserProfile" component={Profile}/>
  <Stack.Screen name="CameraView" component={CameraView}/>
</Stack.Navigator>
票数 53
EN

Stack Overflow用户

发布于 2020-02-12 04:43:52

你应该尝试重新排列你的屏幕层,

原创

  • TabBar
    • 池塘(堆栈)
      • PondScreen
      • DetailScreen

代码语言:javascript
复制
- Stock
- Others

相反,尝试将顶部堆栈设置为

  • TopStack
    • TabBar
      • PondScreen
      • 股票
      • 其他

代码语言:javascript
复制
- Details

应该能够在每个屏幕中隐藏底部的选项卡栏或选项卡标题。

票数 18
EN

Stack Overflow用户

发布于 2020-11-20 15:39:34

接受的答案是很好的,但您可能希望内联地这样做,并使用getFocusedRouteNameFromRoute来确保安全。此代码与已接受的答案相同:

代码语言:javascript
复制
<Tabs.Screen
    name="Home"
    component={HomeStack}
    options={({ route }) => ({
        tabBarVisible: ((route) => {
            const routeName = getFocusedRouteNameFromRoute(route) ?? ""

            if (routeName === "CameraView") {
                return false
            }

            return true
        })(route),
    })}
/>
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60177053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档