QuickBlox集成中new NativeEventEmitter()传参告警致监听失效
问题场景
开发文本聊天应用接入QuickBlox实现即时通讯能力时,最初编写的新消息事件监听代码如下:
const emitter = new NativeEventEmitter(QB.chat); const receivedNewMessage = (event) =>{ const { type, payload } = event; // 处理新消息逻辑 // type - 事件名称(字符串类型) // payload - 接收到的消息体(对象类型) console.log("payload ==>", payload); console.log("type ==>", type); } emitter.addListener( QB.chat.EVENT_TYPE.RECEIVED_NEW_MESSAGE, receivedNewMessage );
代码运行后抛出如下警告:new NativeEventEmitter() was called with a non-null argument without the required removeListeners method
警告出现后,新消息接收监听逻辑完全不触发,拿不到预期的消息回调。
问题原因
- React Native 0.65及以上版本对
NativeEventEmitter做了强校验,传入构造函数的原生模块必须在原生层实现addListeners、removeListeners两个生命周期方法,缺失方法就会抛出上述警告,同时事件订阅逻辑会失效。 - QuickBlox RN SDK内部已经封装了完整的事件桥接和监听逻辑,开发者手动实例化新的
NativeEventEmitter属于错误用法,会绕过SDK内部的事件转发链路,直接导致消息监听不触发。
修复方法
- 移除手动实例化
NativeEventEmitter的代码,直接调用QB.chat模块内置的订阅方法即可,修正后的代码:
const receivedNewMessage = (event) =>{ const { type, payload } = event; // 新消息处理逻辑 console.log("payload ==>", payload); console.log("type ==>", type); } // 直接使用SDK封装的addListener接口 const messageSubscription = QB.chat.addListener( QB.chat.EVENT_TYPE.RECEIVED_NEW_MESSAGE, receivedNewMessage ); // 页面卸载/不需要监听时调用移除方法,避免内存泄漏 // messageSubscription.remove()
- 如果是自行开发维护原生模块遇到同类警告,需要在原生模块代码中补全两个必需方法:
- Android端在对应ReactContextBaseJavaModule子类中添加:
@ReactMethod public void addListeners(String eventName) { // 可留空,按需实现监听计数逻辑 } @ReactMethod public void removeListeners(double count) { // 可留空,按需实现监听计数逻辑 }- iOS端在对应RCTBridgeModule实现类中添加:
- (void)addListeners:(NSString *)eventName { // 可留空,按需实现监听计数逻辑 } - (void)removeListeners:(double)count { // 可留空,按需实现监听计数逻辑 }
内容的提问来源于stack exchange,提问作者React_Coder
相关产品推荐
相关产品推荐

