DeviceEventEmitter 与 NativeAppEventEmitter
Posted
技术标签:
【中文标题】DeviceEventEmitter 与 NativeAppEventEmitter【英文标题】:DeviceEventEmitter vs NativeAppEventEmitter 【发布时间】:2016-04-18 11:16:27 【问题描述】:我想使用事件在原生 ios/android 和我的 react 原生应用之间进行通信。
我看到有两种方法可以做到这一点:DeviceEventEmitter 和 NativeAppEventEmitter,它们似乎完全一样。
它们之间有什么区别?我为什么要选择一个而不是另一个?
【问题讨论】:
【参考方案1】:DeviceEventEmitter
和NativeAppEventEmitter
都已弃用,您应该改用NativeEventEmitter
。
【讨论】:
你是从哪里知道的?我在 RN 文档中的任何地方都没有看到这个 任何来源将不胜感激:) 来源:github.com/facebook/react-native/blob/… & github.com/facebook/react-native/blob/…【参考方案2】:我发现在开发需要将事件从 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);
);
【讨论】:
这没有理由选择其中之一,因为它是错误的。查看 iOS 的 RCTEventDispatcher 的 sendDeviceEventWithName 和 React Native Android 的 com.facebook.react.modules.core.RCTNativeAppEventEmitter,您可以从两个平台发送到两个事件发射器。 @Rubys 哦,好吧,我不知道。我直接在 Native Extension 文档中工作,该文档在 iOS 上使用 NativeAppEventEmitter,在 Android 上使用 DeviceEventEmitter - 原因还不是很清楚。 是的,这正是我的问题 :)以上是关于DeviceEventEmitter 与 NativeAppEventEmitter的主要内容,如果未能解决你的问题,请参考以下文章
ReactNative进阶(三十九):DeviceEventEmitter 实现发送和监听消息
SyntaxError - node_modules/react-native/Libraries/polyfills/error-guard.js:缺少分号。 (14:4) 在 react nati