DeviceEventEmitter vs NativeAppEventEmitter

后端 未结 2 1403
误落风尘
误落风尘 2021-02-12 13:24

I want to use events to communicate between native ios/android and my react native app.

I see two ways to do this: DeviceEventEmitter and NativeAppEventEmitter, which se

2条回答
  •  粉色の甜心
    2021-02-12 14:01

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

提交回复
热议问题