【问题标题】:React Navigation 5 How to Map Drawer Stack Screens?React Navigation 5 如何映射抽屉堆栈屏幕?
【发布时间】:2021-01-12 03:40:36
【问题描述】:

我正在尝试做一个动态抽屉,我的 StackItens(路由)如下所示:

import React from 'react';
import Home from '../screens/home/Index';
import ATR from '../screens/atr/Index';

const stackNavigItems = [
  {
    group: 'Home',
    name: 'Home',
    component: Home,
    icon: 'home',
    iconType: 'FontAwesome',
    label: 'Principal',
    hideMenu: false,
    screenComponent: props => {
      return <Home {...props} />;
    },
  },
  {
    group: 'Home',
    name: 'ATR',
    component: ATR,
    icon: 'book',
    iconType: 'Ionicons',
    label: 'ATR',
    hideMenu: false,
    screenComponent: props => {
      return <ATR {...props} />;
    },
  },
];

export {stackNavigItems};

在我的抽屉内容中,我映射了这些项目并且工作正常。 但是当我使用此代码在导航器中映射相同的项目时:

<PaperProvider theme={theme}>
  <AuthContext.Provider value={authContext}>
    <NavigationContainer theme={theme}>
      <Drawer.Navigator drawerContent={props => <DrawerContent {...props} />}>
    {stackNavigItems.map(r => {
      return (
        <Drawer.Screen
          key={r.name}
          name={r.name}
          component={({navigation}) => (
            <Stack.Navigator
              initialRouteName="Home"
              headerMode="screen"
              screenOptions={screenOptions}>
              <Stack.Screen
                name={r.name}
                component={props => <r.screenComponent {...props} />}
                options={{
                  title: r.label,
                  headerLeft: () => (
                    <Icon.Button
                      name="ios-menu"
                      size={IconStyles.size}
                      backgroundColor={AppStyles.color.main}
                      onPress={() => {
                        navigation.openDrawer();
                      }}
                    />
                  ),
                }}
              />
            </Stack.Navigator>
          )}
        />
      );
    })}
  </Drawer.Navigator>
    </NavigationContainer>
  </AuthContext.Provider>
</PaperProvider>

应用程序总是向我显示此警告,并且标头大小加倍:

我尝试了很多在组件之前传递函数“()”的方法,但没有任何效果。如果我禁用警告,应用程序会在不显示警告的情况下运行,但有时标题会在使用图片时加倍大小。

【问题讨论】:

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


    【解决方案1】:

    您可以通过创建一个额外的组件并正常传递它并通过initialParams 将导航项的id 传递给额外的组件来避免使用内联函数:

    const StackNavigator = ({route}) => {
      const navigationItem = stackNavigItems[route.params?.navigationItemId];
      return (
        <Stack.Navigator initialRouteName="Home" headerMode="screen">
          <Stack.Screen
            name={navigationItem.name}
            component={navigationItem.screenComponent}
            options={{
              title: navigationItem.label,
              headerLeft: () => null,
            }}
          />
        </Stack.Navigator>
      );
    };
    
    function App() {
      return (
        <NavigationContainer>
          <Drawer.Navigator drawerContent={(props) => null}>
            {stackNavigItems.map((r) => {
              return (
                <Drawer.Screen
                  key={r.name}
                  name={r.name}
                  component={StackNavigator}
                  initialParams={{navigationItemId: r.id}}
                />
              );
            })}
          </Drawer.Navigator>
        </NavigationContainer>
      );
    }
    

    因此,对于这种方法,您确实需要向 stackNavigItems 内的对象添加一个 id 属性:

    const stackNavigItems = [
      {
        id: 0,
        group: 'Home',
        name: 'Home',
        component: Home,
        icon: 'home',
        iconType: 'FontAwesome',
        label: 'Principal',
        hideMenu: false,
        screenComponent: (props) => {
          return <Home {...props} />;
        },
      },
      {
        id: 1,
        group: 'Home',
        name: 'ATR',
        component: ATR,
        icon: 'book',
        iconType: 'Ionicons',
        label: 'ATR',
        hideMenu: false,
        screenComponent: (props) => {
          return <ATR {...props} />;
        },
      },
    ];
    

    我省略了一些不相关的代码,以使这个示例更具可读性。

    【讨论】:

    • 感谢您的回答,但也不是这样。
    • 你是我的天使!!!工作!!!非常感谢您的时间和耐心。
    • 按照你的建议,我删除了这个问题。
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多