2016-04-18 1 views
11

Ich möchte Ereignisse verwenden, um zwischen nativen iOS/Android und meiner nativen App zu kommunizieren.DeviceEventEmitter vs NativeAppEventEmitter

Ich sehe zwei Möglichkeiten, dies zu tun: DeviceEventEmitter und NativeAppEventEmitter, die ziemlich identisch scheinen.

Was ist der Unterschied zwischen ihnen? Warum sollte ich eins über das andere auswählen?

Antwort

1

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}); 
    });                        
+1

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

+1

@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. –

+1

Ja, das ist genau mein Problem :) – Rubys

0

Beide DeviceEventEmitter und NativeAppEventEmitter veraltet sind, sollten Sie NativeEventEmitter stattdessen verwenden.

+0

wo hast du das herausgefunden? Ich habe das nirgendwo in der RN-Dokumentation gesehen – oliver

Verwandte Themen