Do not eagerly allocate all view managers in DefaultReactNativeHost (#42869)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/42869

`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

fbshipit-source-id: be8437e2127fb6741d1948cecbcf5c3d9f8de268
This commit is contained in:
Pieter De Baets
2024-02-05 05:44:32 -08:00
committed by Facebook GitHub Bot
parent 1ce7bfd8c9
commit f3977afb77
@@ -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)