调用addData添加Todo时出现EventEmitter.removeListener弃用警告的原因是什么
警告触发原因
你收到的是EventEmitter废弃API的调用提醒,该警告并非由你贴出的addData、onAddTodo新增数据的代码直接导致,触发的核心原因有两类:
- React Native/Node.js的
EventEmitter模块早已废弃removeListener(eventName, callback)写法,官方要求后续统一调用addListener返回的订阅对象自带的remove()方法取消监听 - 你调用的
getTodos方法内部大概率使用了Firestore的onSnapshot实时监听接口,你当前使用的@react-native-firebase/firestore版本较低,底层实现监听销毁逻辑时依然调用了已经被弃用的removeListener方法,每次你新增数据后刷新列表调用getTodos时,就会触发该警告 - 少部分情况是你手动编写监听器移除逻辑时,直接调用了
removeListener方法,也会触发该提醒
修复方案
该警告仅为弃用提示,不会影响现有功能正常运行,可根据实际情况选择修复方式:
- 优先升级
@react-native-firebase/firestore及相关RN Firebase依赖到最新稳定版,官方已经在后续版本修复了底层调用废弃API的问题,升级后警告会自动消失 - 调整你自己的Firestore监听逻辑,不要手动调用
removeListener方法,保存onSnapshot返回的取消订阅函数,在需要销毁监听时直接调用该函数即可,参考写法:
// 声明变量保存取消订阅函数 let unsubscribe = null; const getTodos = () => { // 先销毁之前的旧监听,避免重复注册 if (unsubscribe) unsubscribe(); unsubscribe = firestore() .collection(constants.collection_name) .where('is_deleted', '==', false) .onSnapshot(querySnapshot => { // 处理todo列表更新逻辑 }, err => showError(err)) } // 组件卸载时调用取消监听,避免内存泄漏 useEffect(() => { return () => { if (unsubscribe) unsubscribe(); } }, [])
- 若暂时无法升级依赖也不想看到警告,可以在项目入口文件添加日志过滤规则:
import { LogBox } from 'react-native'; LogBox.ignoreLogs(['EventEmitter.removeListener']);
内容的提问来源于stack exchange,提问作者Kanwarjeet Singh
相关产品推荐
相关产品推荐

