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

React Native Android原生模块向JS发送事件无响应求助

解决Android原生模块向React Native传递事件无响应问题

以下是针对你代码中问题的逐一修正方案:

1. Android端:CoinObserver内ReactContext未初始化

你的CoinObserver内部定义了private ReactContext reactContext但从未赋值,导致调用getJSModule时触发空指针异常,且被无日志的catch块吞掉,无法排查问题。直接使用模块的getReactApplicationContext()即可:

public CoinObserver coinObserver =  new CoinObserver() {
  @Override
  public void update(MyCCT cct, float coin) {
    Log.d("Coin", Float.toString(coin));
    try {
      getReactApplicationContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("onReceivedCoin", coin);
    } catch (Exception ex) {
      Log.e("CoinEventError", "Failed to emit coin event", ex); // 保留错误日志便于排查
    }
  }
};

2. Android端:模块名称大小写不匹配

@ReactModule注解的name使用了常量NAME = "CoinboxCollector",但getName()方法返回的是"CoinBoxCollector",大小写不一致会导致RN端无法正确识别模块。修改getName()方法直接返回常量:

@NonNull
@Override
public String getName() {
  return NAME; // 统一使用常量,避免大小写错误
}

3. React Native端:事件监听被立即移除

useEffect的return语句直接调用eventListener.remove(),会在组件挂载后立刻取消监听,导致永远收不到事件。需返回一个清理函数,在组件卸载时执行移除操作:

useEffect(() => {
  const eventEmitter = new NativeEventEmitter(NativeModules.CoinBoxCollector);
  const eventListener = eventEmitter.addListener(
    'onReceivedCoin',
    onCoinDetected
  );
  return () => { // 组件卸载时才移除监听
    eventListener.remove();
  };
}, []);

4. React Native端:Alert参数类型错误

Alert.alert的第二个参数要求是字符串类型,直接传入数字coin会触发类型错误,需先转换:

async function onCoinDetected(coin: any) {
  Alert.alert('ricevuti soldi', String(coin));
  console.log('ricevuti soldi:', coin);
}

额外排查建议

  • 确认Android端initialize方法执行成功,且cct.start()确实触发了CoinObserver的update方法(可通过Log.d("Coin",...)日志验证)
  • 检查RN端NativeModules.CoinBoxCollector是否存在,可在控制台打印console.log(NativeModules.CoinBoxCollector)确认模块加载正常

内容的提问来源于stack exchange,提问作者greta calamari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:55:16