Ответ 1
Я нашел, что мне нужно использовать оба варианта при разработке кросс-платформенных родных расширений, которые должны отправлять события из Java/Obj-C в JavaScript.
На iOS вы отправляете события в JS следующим образом:
[self.bridge.eventDispatcher sendAppEventWithName:@"myProgressEvent" body:@{
@"progress": @( (float)loaded / (float)total )
}];
который вы забираете в JS, используя NativeAppEventEmitter
.
В Java вы отправляете события в JS с:
WritableMap map = Arguments.createMap();
map.putDouble("progress", progress);
getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("myProgressEvent", map);
.. который вы забираете в JS, используя DeviceEventEmitter
Это не идеально, так как ваш JS-код должен выбрать правильный излучатель для получаемых событий.
Например
const emitter = Platform.OS == 'ios' ? NativeAppEventEmitter : DeviceEventEmitter;
emitter.addListener("myProgressEvent", (e:Event)=>{
console.log("myProgressEvent " + JSON.stringify(e));
if (!e) {
return;
}
this.setState({progress: e.progress});
});