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
相关产品推荐
相关产品推荐

