diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java
index b084ccbb43d..62109851897 100644
--- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java
+++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java
@@ -160,4 +160,7 @@ public class ReactFeatureFlags {
/** Clean yoga node when does not change. */
public static boolean enableCleanParagraphYogaNode = false;
+
+ /** Default state updates and events to async batched priority. */
+ public static boolean enableDefaultAsyncBatchedPriority = false;
}
diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp
index ea4cf210f4b..71bb6852c0a 100644
--- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp
+++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp
@@ -435,6 +435,8 @@ void Binding::installFabricUIManager(
getFeatureFlagValue("doNotSwapLeftAndRightOnAndroidInLTR");
CoreFeatures::enableCleanParagraphYogaNode =
getFeatureFlagValue("enableCleanParagraphYogaNode");
+ CoreFeatures::enableDefaultAsyncBatchedPriority =
+ getFeatureFlagValue("enableDefaultAsyncBatchedPriority");
// RemoveDelete mega-op
ShadowViewMutation::PlatformSupportsRemoveDeleteTreeInstruction =
diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp
index e5582ec2c69..4f57f76066f 100644
--- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp
+++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewEventEmitter.cpp
@@ -6,6 +6,7 @@
*/
#include "BaseViewEventEmitter.h"
+#include
namespace facebook::react {
@@ -112,7 +113,9 @@ void BaseViewEventEmitter::onLayout(const LayoutMetrics &layoutMetrics) const {
payload.setProperty(runtime, "layout", std::move(layout));
return jsi::Value(std::move(payload));
},
- EventPriority::AsynchronousUnbatched);
+ CoreFeatures::enableDefaultAsyncBatchedPriority
+ ? EventPriority::AsynchronousBatched
+ : EventPriority::AsynchronousUnbatched);
}
} // namespace facebook::react
diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h
index 61fb3299cf7..a9f2ce17443 100644
--- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h
+++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h
@@ -12,6 +12,7 @@
#include
#include
+#include
namespace facebook::react {
@@ -58,9 +59,7 @@ class ConcreteState : public State {
* function for cases where a new value of data does not depend on an old
* value.
*/
- void updateState(
- Data &&newData,
- EventPriority priority = EventPriority::AsynchronousUnbatched) const {
+ void updateState(Data &&newData, EventPriority priority) const {
updateState(
[data{std::move(newData)}](Data const &oldData) -> SharedData {
return std::make_shared(data);
@@ -68,6 +67,14 @@ class ConcreteState : public State {
priority);
}
+ void updateState(Data &&newData) const {
+ updateState(
+ std::move(newData),
+ CoreFeatures::enableDefaultAsyncBatchedPriority
+ ? EventPriority::AsynchronousBatched
+ : EventPriority::AsynchronousUnbatched);
+ }
+
/*
* Initiate a state update process with a given function (that transforms an
* old data value to a new one) and priority. The callback function can be
diff --git a/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp
index 70054a836ba..88def7c490d 100644
--- a/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp
+++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp
@@ -21,5 +21,6 @@ bool CoreFeatures::doNotSwapLeftAndRightOnAndroidInLTR = false;
bool CoreFeatures::enableCleanParagraphYogaNode = false;
bool CoreFeatures::disableScrollEventThrottleRequirement = false;
bool CoreFeatures::enableGranularShadowTreeStateReconciliation = false;
+bool CoreFeatures::enableDefaultAsyncBatchedPriority = false;
} // namespace facebook::react
diff --git a/packages/react-native/ReactCommon/react/utils/CoreFeatures.h b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h
index 3a3763976ec..8b3a53bc353 100644
--- a/packages/react-native/ReactCommon/react/utils/CoreFeatures.h
+++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h
@@ -64,6 +64,9 @@ class CoreFeatures {
// When enabled, the renderer would only fail commits when they propagate
// state and the last commit that updated state changed before committing.
static bool enableGranularShadowTreeStateReconciliation;
+
+ // Default state updates and events to async batched priority.
+ static bool enableDefaultAsyncBatchedPriority;
};
} // namespace facebook::react