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

How to hide Drawer item in react-navigation 5x?

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

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

这是我当前的代码:

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')(这是在 react-navigation 4x 上工作)。

此外,这就是我在 react-navigation 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>
  ;

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

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

this issue.

的帮助下,我刚刚设法妥善解决了这个问题

要正确隐藏项目,您应该创建一个过滤路由的函数,并将其传递给 Drawer.Navigator[= 的 drawerContent 属性23=].

假设您想从抽屉中隐藏 登录 屏幕,但您仍然希望能够导航到它,无论何时,您应该做类似的事情这个:

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' }}
       />
        .
        .
        .

希望这对您有所帮助,干杯。