I've found I need to use both when developing cross-platform native extensions that need to send events from Java/Obj-C to JavaScript.
On iOS you send events to JS like this:
[self.bridge.eventDispatcher sendAppEventWithName:@"myProgressEvent" body:@{
@"progress": @( (float)loaded / (float)total )
}];
.. which you pick up in JS using NativeAppEventEmitter
.
In Java you send events to JS with:
WritableMap map = Arguments.createMap();
map.putDouble("progress", progress);
getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("myProgressEvent", map);
.. which you pick up in JS using DeviceEventEmitter
It's not ideal, as your JS code needs to then choose the right
emitter for the events to be received.
E.g.
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});
});