如何在react-navigation 5x中隐藏Drawer项目?

时间:2020-06-04 21:01:47

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

我正在尝试使用react-navigation在我的应用程序中创建一个Drawer导航,但是我很难隐藏一个项目。 我想要的是:创建一些屏幕(以在应用程序内部导航),但不在Drawer中显示这些屏幕。 我正在使用以下文档:(https://reactnavigation.org/docs/nesting-navigators/#navigator-specific-methods-are-available-in-the-navigators-nested-inside

但是我有两个问题:1)Root仍在显示; 2)我无法直接导航到“隐藏”屏幕,它说该屏幕不存在。

这是我当前的代码:

const Stack = createStackNavigator();
function Root2() {
  return (
    <Stack.Navigator>
      <Stack.Screen name="NewEditPilot" component={NewEditPilot} />
      <Stack.Screen name="Settings" component={Settings} />
    </Stack.Navigator>
  );
}


const Drawer = createDrawerNavigator();

function MyDrawer() {
  return (
    <Drawer.Navigator drawerContent={props => <SideBar2 {...props} />}>
      <Drawer.Screen name="Home" component={Home} />
      <Drawer.Screen name="PilotMgnt" component={PilotMgnt} />
      <Drawer.Screen name="Root2" component={Root2} />
    </Drawer.Navigator>
  );
}


export default function App() {


  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <Root>
          <NavigationContainer>
            <MyDrawer />
          </NavigationContainer>
        </Root>
      </PersistGate>
    </Provider>
  );
}

在这种情况下,我试图隐藏NewEditPilotSettings屏幕。这就是我导航到以下屏幕的方式:navigation.navigate('NewEditPilot')(正在4x反应导航上运行)。

此外,这就是我在4x反应导航中的使用方式(和工作方式!):

// Telas principais
const Drawer = DrawerNavigator(
  {
    Home: { screen: Home },
    PilotMgnt: { screen: PilotMgnt},
    CurRace: { screen: CurRace},
    Settings: { screen: Settings},        
    LogViewScreen: { screen: LogViewScreen},    
  },
  {
    initialRouteName: "Home",
    contentOptions: {
      activeTintColor: "#e91e63"
    },
    contentComponent: props => <SideBar {...props} />
  }
);

// sub-telas
const AppNavigator = StackNavigator(
  {
    Drawer: { screen: Drawer },    
    NewEditPilot: { screen: NewEditPilot },
    PersonalRank: { screen: PersonalRank },  
    RCharts: { screen: RCharts},
    RChartsArchive: { screen: RChartsArchive},
    Archive: { screen: Archive },
    ArchiveView: { screen: ArchiveView },
    ArchivePersonalRank: { screen: ArchivePersonalRank },
  },
  {
    initialRouteName: "Drawer",
    headerMode: "none"
  }
);




export default () =>
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <Root>
          <AppNavigator />
        </Root>
      </PersistGate>
    </Provider>
  ;

2 个答案:

答案 0 :(得分:0)

在Sidebar2组件中,您可以选择创建一个自定义<DrawerContentScrollView />,它将具有<DrawerItem />。这些<DrawerItem />将是您希望在抽屉中可见的那些项目。 navigation道具默认情况下传递给抽屉内容组件。您可以使用navigation.navigate('Screen_Name')使用此导航道具导航到特定屏幕。确保您要导航的路线上有<Drawer.Screen>可用。

https://reactnavigation.org/docs/drawer-navigator#providing-a-custom-drawercontent

答案 1 :(得分:0)

this issue的帮助下,我只是设法解决了这个问题。

要正确隐藏项目,您应该创建一个过滤路线的函数,并将其传递给 Drawer.Navigator drawerContent 道具。

让我们假设您想从抽屉中隐藏登录屏幕,但是您仍然希望能够导航到该屏幕,只要需要,您应该执行以下操作:

import {
  createDrawerNavigator,
  DrawerContentScrollView,
  DrawerItemList,
} from '@react-navigation/drawer';

const Drawer = createDrawerNavigator();
    
const CustomDrawerContent = (props) => {
    const { state, ...rest } = props;
    const newState = { ...state };
    newState.routes = newState.routes.filter(
      (item) => item.name !== 'Login',
    );
    
    return (
      <DrawerContentScrollView {...props}>
        <DrawerItemList state={newState} {...rest} />
      </DrawerContentScrollView>
    );
  };
    
  export default () => (
    <Drawer.Navigator
      initialRouteName="Home"
      drawerContent={(props) => <CustomDrawerContent {...props} />}
      screenOptions={{
        headerShown: true,
      }}>
       <Drawer.Screen
         name="Home"
         component={HomeScreen}
         options={{ title: 'Home' }}
       />
        .
        .
        .

希望这会有所帮助,加油。