You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native报错:TypeError: undefined is not an object(navigation.toggleDrawer)

解决React Navigation中navigation.toggleDrawer未定义的问题

我看了你遇到的问题——点击抽屉按钮时触发TypeError: undefined is not an object (evaluating 'navigation.toggleDrawer'),根源是你自定义的toDrawerButton写法有误,导致无法正确获取到navigation对象。

问题出在哪?

你原来的toDrawerButton定义搞错了参数解构的逻辑:

const toDrawerButton = ({ headerLeft: ({navigation}) => (<Button icon = {<Icon name='menu' size={24} color='black' onPress={() => navigation.toggleDrawer()}/>} />)});

这里你试图直接解构headerLeft,但实际上options应该是一个返回配置对象的函数,这个函数的参数会包含navigation,我们需要从这个参数里拿到navigation,再定义headerLeft组件。

修正方案

把toDrawerButton改成正确的写法,让它返回包含headerLeft的配置对象,并且正确接收navigation参数:

const toDrawerButton = ({ navigation }) => ({
  headerLeft: () => (
    <Button
      icon={<Icon name='menu' size={24} color='black' />}
      onPress={() => navigation.toggleDrawer()}
      type="clear" // 加上这个可以去掉按钮默认的背景,更像一个纯图标按钮
    />
  )
});

然后你的MenuNavigator.Screen使用这个配置就没问题了:

<MenuNavigator.Screen name = "Menu" component={Menu} options={toDrawerButton}/>

另一种更直接的写法

如果你不想单独定义toDrawerButton,也可以直接在options里写匿名函数,逻辑更清晰:

<MenuNavigator.Screen 
  name="Menu" 
  component={Menu} 
  options={({ navigation }) => ({
    headerLeft: () => (
      <Button
        icon={<Icon name='menu' size={24} color='black' />}
        onPress={() => navigation.toggleDrawer()}
        type="clear"
      />
    )
  })}
/>

额外说明

你的代码里把NavigationContainer放在了DrawerNavigatorScreens里是正确的,整个导航结构只需要一个NavigationContainer包裹,这样内部的屏幕才能正确获取到navigation上下文。

内容的提问来源于stack exchange,提问作者Claudio Fragomeli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:33:44