DeviceEventEmitter vs NativeAppEventEmitter

Я хочу использовать события для связи между родным ios/android и моим соответствующим родным приложением.

Я вижу два способа сделать это: DeviceEventEmitter и NativeAppEventEmitter, которые кажутся довольно идентичными.

Какая разница между ними? Почему я должен выбирать один за другим?

Ответ 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});
    });                                                                                             

Ответ 2

И DeviceEventEmitter и NativeAppEventEmitter устарели, вместо этого вы должны использовать NativeEventEmitter.