From a5cced328c2b89a7bbdf77a3d3e0ea5cdfa74d79 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 5 Feb 2024 04:28:56 -0800 Subject: [PATCH] Do not eagerly allocate all view managers in DefaultReactNativeHost (#42869) Summary: `DefaultReactNativeHost` builds a `ViewManagerRegistry` based on a list of ViewManagers, which is inefficient, as we have to allocate them all ahead of time (defeating the purpose of `ViewManagerOnDemandReactPackage`). Instead provide a `ViewManagerResolver`which lazily resolves them. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D53406841 --- .../react/defaults/DefaultReactNativeHost.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactNativeHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactNativeHost.kt index e5683059a68b..66c705ba1994 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactNativeHost.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactNativeHost.kt @@ -11,7 +11,6 @@ import android.app.Application import android.content.Context import com.facebook.react.JSEngineResolutionAlgorithm import com.facebook.react.ReactHost -import com.facebook.react.ReactInstanceManager import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackageTurboModuleManagerDelegate import com.facebook.react.bridge.ReactApplicationContext @@ -20,6 +19,7 @@ import com.facebook.react.fabric.ComponentFactory import com.facebook.react.fabric.FabricUIManagerProviderImpl import com.facebook.react.fabric.ReactNativeConfig import com.facebook.react.uimanager.ViewManagerRegistry +import com.facebook.react.uimanager.ViewManagerResolver /** * A utility class that allows you to simplify the setup of a [ReactNativeHost] for new apps in Open @@ -46,13 +46,17 @@ protected constructor( if (isNewArchEnabled) { UIManagerProvider { reactApplicationContext: ReactApplicationContext -> val componentFactory = ComponentFactory() - DefaultComponentsRegistry.register(componentFactory) - val reactInstanceManager: ReactInstanceManager = getReactInstanceManager() + val viewManagerRegistry = + ViewManagerRegistry( + object : ViewManagerResolver { + override fun getViewManager(viewManagerName: String) = + reactInstanceManager.createViewManager(viewManagerName) + + override fun getViewManagerNames() = reactInstanceManager.viewManagerNames + }) - val viewManagers = reactInstanceManager.getOrCreateViewManagers(reactApplicationContext) - val viewManagerRegistry = ViewManagerRegistry(viewManagers) FabricUIManagerProviderImpl( componentFactory, ReactNativeConfig.DEFAULT_CONFIG, viewManagerRegistry) .createUIManager(reactApplicationContext)