diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index 77f7719dcc0..b5fa421a35a 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -59,16 +59,6 @@ Scheduler::Scheduler( auto uiManager = std::make_shared(runtimeExecutor_, contextContainer_); - if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { - auto animationBackend = std::make_shared( - schedulerToolbox.animationChoreographer, uiManager); - - schedulerToolbox.animationChoreographer->setAnimationBackend( - animationBackend); - - uiManager->unstable_setAnimationBackend(animationBackend); - } - auto eventOwnerBox = std::make_shared(); eventOwnerBox->owner = eventDispatcher_; @@ -131,6 +121,19 @@ Scheduler::Scheduler( uiManager->setDelegate(this); uiManager->setComponentDescriptorRegistry(componentDescriptorRegistry_); + // Must come after `setDelegate`: the backend's constructor registers a + // surface-start callback, and `UIManager` silently drops those while it has + // no delegate. + if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { + auto animationBackend = std::make_shared( + schedulerToolbox.animationChoreographer, uiManager); + + schedulerToolbox.animationChoreographer->setAnimationBackend( + animationBackend); + + uiManager->unstable_setAnimationBackend(animationBackend); + } + auto bindingsExecutor = schedulerToolbox.bridgelessBindingsExecutor.has_value() ? schedulerToolbox.bridgelessBindingsExecutor.value()