diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp index a7fe0cd7f00..cdb05f4719f 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp @@ -37,11 +37,19 @@ void EventBeat::setBeatCallback(BeatCallback beatCallback) { beatCallback_ = std::move(beatCallback); } +void EventBeat::unstable_setInduceCallback(std::function callback) { + induceCallback_ = std::move(callback); +} + void EventBeat::induce() const { if (!isEventBeatRequested_) { return; } + if (induceCallback_) { + induceCallback_(); + } + isEventBeatRequested_ = false; if (isBeatCallbackScheduled_) { diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h index ae88c8a5f51..de5cabccbe0 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h @@ -121,6 +121,15 @@ class EventBeat { */ void setBeatCallback(BeatCallback beatCallback); + /* + * The callback will be executed once a consumer (for example EventQueue) + * calls either `EventBeat::request` or `EventBeat::requestSynchronous`. The + * callback will be executed on the UI thread. + * + * If not set, this is a no-op and callback won't be called. + */ + void unstable_setInduceCallback(std::function callback); + protected: /* * Induces the next beat to happen as soon as possible. @@ -129,6 +138,7 @@ class EventBeat { void induce() const; BeatCallback beatCallback_; + std::function induceCallback_; std::shared_ptr ownerBox_; /* diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp index fb18eea2488..8d5476b2137 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp @@ -7,7 +7,6 @@ #include "EventDispatcher.h" #include -#include #include #include "EventQueue.h" @@ -43,11 +42,7 @@ void EventDispatcher::experimental_flushSync() const { } void EventDispatcher::dispatchStateUpdate(StateUpdate&& stateUpdate) const { - if (ReactNativeFeatureFlags::enableSynchronousStateUpdates()) { - statePipe_(stateUpdate); - } else { - eventQueue_.enqueueStateUpdate(std::move(stateUpdate)); - } + eventQueue_.enqueueStateUpdate(std::move(stateUpdate)); } void EventDispatcher::dispatchUniqueEvent(RawEvent&& rawEvent) const { diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp index 6eee3cd102f..c8f9b5c9342 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp @@ -7,6 +7,7 @@ #include "EventQueue.h" +#include #include "EventEmitter.h" #include "ShadowNodeFamily.h" @@ -19,6 +20,10 @@ EventQueue::EventQueue( eventBeat_(std::move(eventBeat)) { eventBeat_->setBeatCallback( [this](jsi::Runtime& runtime) { onBeat(runtime); }); + + if (ReactNativeFeatureFlags::enableSynchronousStateUpdates()) { + eventBeat_->unstable_setInduceCallback([this]() { flushStateUpdates(); }); + } } void EventQueue::enqueueEvent(RawEvent&& rawEvent) const { @@ -84,7 +89,9 @@ void EventQueue::experimental_flushSync() const { } void EventQueue::onBeat(jsi::Runtime& runtime) const { - flushStateUpdates(); + if (!ReactNativeFeatureFlags::enableSynchronousStateUpdates()) { + flushStateUpdates(); + } flushEvents(runtime); }