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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:36:42