diff --git a/Libraries/EventEmitter/NativeEventEmitter.js b/Libraries/EventEmitter/NativeEventEmitter.js index be0de96f7..5c9796002 100644 --- a/Libraries/EventEmitter/NativeEventEmitter.js +++ b/Libraries/EventEmitter/NativeEventEmitter.js @@ -14,18 +14,24 @@ const EventEmitter = require('EventEmitter'); const Platform = require('Platform'); const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); + const invariant = require('fbjs/lib/invariant'); import type EmitterSubscription from 'EmitterSubscription'; +type NativeModule = { + +addListener: (eventType: string) => void, + +removeListeners: (count: number) => void, +}; + /** * Abstract base class for implementing event-emitting modules. This implements * a subset of the standard EventEmitter node module API. */ class NativeEventEmitter extends EventEmitter { - _nativeModule: Object; + _nativeModule: ?NativeModule; - constructor(nativeModule: Object) { + constructor(nativeModule: ?NativeModule) { super(RCTDeviceEventEmitter.sharedSubscriber); if (Platform.OS === 'ios') { invariant(nativeModule, 'Native module cannot be null.'); @@ -33,8 +39,12 @@ class NativeEventEmitter extends EventEmitter { } } - addListener(eventType: string, listener: Function, context: ?Object): EmitterSubscription { - if (Platform.OS === 'ios') { + addListener( + eventType: string, + listener: Function, + context: ?Object, + ): EmitterSubscription { + if (this._nativeModule != null) { this._nativeModule.addListener(eventType); } return super.addListener(eventType, listener, context); @@ -42,15 +52,15 @@ class NativeEventEmitter extends EventEmitter { removeAllListeners(eventType: string) { invariant(eventType, 'eventType argument is required.'); - if (Platform.OS === 'ios') { - const count = this.listeners(eventType).length; + const count = this.listeners(eventType).length; + if (this._nativeModule != null) { this._nativeModule.removeListeners(count); } super.removeAllListeners(eventType); } removeSubscription(subscription: EmitterSubscription) { - if (Platform.OS === 'ios') { + if (this._nativeModule != null) { this._nativeModule.removeListeners(1); } super.removeSubscription(subscription);