Ich habe festgestellt, ich brauche beide bei der Entwicklung plattformübergreifende native Erweiterungen, die Ereignisse von Java/Obj-C an JavaScript senden müssen.
Auf iOS Sie Ereignisse JS wie folgt senden:
[self.bridge.eventDispatcher sendAppEventWithName:@"myProgressEvent" body:@{
@"progress": @((float)loaded/(float)total)
}];
.., die Sie in JS NativeAppEventEmitter
mit abholen.
In Java Sie Ereignisse JS mit senden:
WritableMap map = Arguments.createMap();
map.putDouble("progress", progress);
getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("myProgressEvent", map);
.., die Sie in JS abholen mit DeviceEventEmitter
Es ist nicht ideal, da Ihr braucht JS-Code, um dann die richtige Emitter zu wählen für die Ereignisse zu erhalten.
z.
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});
});
Dies ist kein Grund, sich gegenseitig zu wählen, weil es falsch ist. Schauen Sie sich iOSOS RCTEventDispatcher sendDeviceEventWithName, und reagieren native Android com.facebook.react.modules.core.RCTNativeAppEventEmitter, können Sie von beiden Plattformen zu beiden Ereignis-Emitter senden. – Rubys
@Rubys Oh ok, das war mir nicht bewusst. Ich arbeitete direkt aus den Native Extension-Dokumenten, die NativeAppEventEmitter auf iOS und DeviceEventEmitter auf Android verwendet - aus einem Grund, der nicht sehr klar ist. –
Ja, das ist genau mein Problem :) – Rubys