Expo SDK从52升级到53后,调用BackHandler.removeEventListener提示未定义错误的求助
Expo SDK从52升级到53后,调用BackHandler.removeEventListener提示未定义错误的求助
嘿,这个问题我升级Expo SDK53的时候也踩过一模一样的坑!其实根源在于SDK53搭载的React Native版本(大概是0.74.x)里,BackHandler的旧API被彻底移除了——原来的removeEventListener方法已经不存在了,这就是你触发错误的原因。
问题本质
在React Native 0.74及以上版本(对应Expo SDK53),官方废弃并移除了BackHandler.addEventListener和BackHandler.removeEventListener这组旧API,取而代之的是订阅式的新API,用法更简洁也更可靠。
具体修复方案
根据你用的组件类型,分两种情况修改代码:
1. 如果你用的是类组件
原来的旧写法(会报错):
componentDidMount() { this.backHandler = BackHandler.addEventListener('hardwareBackPress', this.handleBackPress); } componentWillUnmount() { // 这里的removeEventListener已经不存在了! BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress); }
改成新的订阅式写法:
componentDidMount() { // 用addListener替代addEventListener,会返回一个订阅对象 this.backSubscription = BackHandler.addListener('hardwareBackPress', this.handleBackPress); } componentWillUnmount() { // 调用订阅对象的remove()方法取消监听 this.backSubscription.remove(); }
2. 如果你用的是函数组件(配合Hooks)
原来的旧写法(会报错):
useEffect(() => { const backHandler = BackHandler.addEventListener('hardwareBackPress', handleBackPress); return () => { // 这里的removeEventListener已经失效 BackHandler.removeEventListener('hardwareBackPress', handleBackPress); }; }, []);
改成新的写法:
useEffect(() => { // 用addListener获取订阅对象 const backSubscription = BackHandler.addListener('hardwareBackPress', handleBackPress); return () => { // 调用订阅对象的remove()方法清理监听 backSubscription.remove(); }; }, []);
额外提醒
你需要检查项目中所有使用BackHandler.removeEventListener的地方,不管是在导航相关的组件还是自定义业务组件里,都要替换成这种新的订阅清理方式。你的导航依赖版本(@react-navigation系列)是兼容新API的,所以只要改完BackHandler的用法,应该就能解决跳转首页时的报错问题了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

