diff --git a/ReactCommon/fabric/events/EventEmitter.cpp b/ReactCommon/fabric/events/EventEmitter.cpp index 271845db2bc..51f547efed6 100644 --- a/ReactCommon/fabric/events/EventEmitter.cpp +++ b/ReactCommon/fabric/events/EventEmitter.cpp @@ -38,6 +38,7 @@ EventEmitter::EventEmitter( Tag tag, WeakEventDispatcher eventDispatcher) : eventTarget_(std::move(eventTarget)), + weakEventTarget_({}), tag_(tag), eventDispatcher_(std::move(eventDispatcher)) {} @@ -66,7 +67,11 @@ void EventEmitter::setEnabled(bool enabled) const { return; } - if (!enabled) { + if (enabled) { + eventTarget_ = weakEventTarget_.lock(); + weakEventTarget_.reset(); + } else { + weakEventTarget_ = eventTarget_; eventTarget_.reset(); } } diff --git a/ReactCommon/fabric/events/EventEmitter.h b/ReactCommon/fabric/events/EventEmitter.h index 5126a40f023..a3220eaed1b 100644 --- a/ReactCommon/fabric/events/EventEmitter.h +++ b/ReactCommon/fabric/events/EventEmitter.h @@ -55,8 +55,8 @@ class EventEmitter { /* * Indicates that an event can be delivered to `eventTarget`. * Callsite must acquire `DispatchMutex` to access those methods. - * The `setEnabled` operation is not guaranteed: the `EventEmitter` cannot - * be re-enabled after disabling; in this case, the method does nothing. + * The `setEnabled` operation is not guaranteed: sometimes `EventEmitter` + * can be re-enabled after disabling, sometimes not. */ void setEnabled(bool enabled) const; bool getEnabled() const; @@ -79,6 +79,7 @@ class EventEmitter { private: mutable SharedEventTarget eventTarget_; + mutable WeakEventTarget weakEventTarget_; Tag tag_; WeakEventDispatcher eventDispatcher_; };