7171import java .util .List ;
7272import java .util .Map ;
7373import java .util .Set ;
74+ import java .util .concurrent .ConcurrentHashMap ;
7475import javax .annotation .Nullable ;
7576
7677/**
@@ -93,6 +94,7 @@ final class ReactInstance {
9394 private final TurboModuleManager mTurboModuleManager ;
9495 private final FabricUIManager mFabricUIManager ;
9596 private final JavaTimerManager mJavaTimerManager ;
97+ private final Map <String , ViewManager > mViewManagers = new ConcurrentHashMap <>();
9698
9799 @ DoNotStrip @ Nullable private ComponentNameResolverManager mComponentNameResolverManager ;
98100 @ DoNotStrip @ Nullable private UIConstantsProviderManager mUIConstantsProviderManager ;
@@ -489,8 +491,12 @@ public void registerSegment(int segmentId, String path) {
489491 }
490492
491493 private @ Nullable ViewManager createViewManager (String viewManagerName ) {
494+ // Return cached view manager if available, no matter it's eagerly or lazily loaded
495+ if (mViewManagers .containsKey (viewManagerName )) {
496+ return mViewManagers .get (viewManagerName );
497+ }
498+ List <ReactPackage > packages = mReactPackages ;
492499 if (mDelegate != null ) {
493- List <ReactPackage > packages = mReactPackages ;
494500 if (packages != null ) {
495501 synchronized (packages ) {
496502 for (ReactPackage reactPackage : packages ) {
@@ -499,6 +505,7 @@ public void registerSegment(int segmentId, String path) {
499505 ((ViewManagerOnDemandReactPackage ) reactPackage )
500506 .createViewManager (mBridgelessReactContext , viewManagerName );
501507 if (viewManager != null ) {
508+ mViewManagers .put (viewManagerName , viewManager );
502509 return viewManager ;
503510 }
504511 }
@@ -507,7 +514,17 @@ public void registerSegment(int segmentId, String path) {
507514 }
508515 }
509516
510- return null ;
517+ // Once a view manager is not found in all react packages via lazy loading, fall back to default
518+ // implementation: eagerly initialize all view managers
519+ for (ReactPackage reactPackage : packages ) {
520+ List <ViewManager > viewManagersInPackage =
521+ reactPackage .createViewManagers (mBridgelessReactContext );
522+ for (ViewManager viewManager : viewManagersInPackage ) {
523+ mViewManagers .put (viewManager .getName (), viewManager );
524+ }
525+ }
526+
527+ return mViewManagers .get (viewManagerName );
511528 }
512529
513530 private @ NonNull Collection <String > getViewManagerNames () {
@@ -534,8 +551,28 @@ public void registerSegment(int segmentId, String path) {
534551
535552 private @ NonNull NativeMap getUIManagerConstants () {
536553 List <ViewManager > viewManagers = new ArrayList <ViewManager >();
537- for (String viewManagerName : getViewManagerNames ()) {
538- viewManagers .add (createViewManager (viewManagerName ));
554+ boolean canLoadViewManagersLazily = true ;
555+
556+ List <ReactPackage > packages = mReactPackages ;
557+ for (ReactPackage reactPackage : packages ) {
558+ if (!(reactPackage instanceof ViewManagerOnDemandReactPackage )) {
559+ canLoadViewManagersLazily = false ;
560+ break ;
561+ }
562+ }
563+ // 1, Retrive view managers via on demand loading
564+ if (canLoadViewManagersLazily ) {
565+ for (String viewManagerName : getViewManagerNames ()) {
566+ viewManagers .add (createViewManager (viewManagerName ));
567+ }
568+ } else {
569+ // 2, There are packages that don't implement ViewManagerOnDemandReactPackage so we retrieve
570+ // view managers via eager loading
571+ for (ReactPackage reactPackage : packages ) {
572+ List <ViewManager > viewManagersInPackage =
573+ reactPackage .createViewManagers (mBridgelessReactContext );
574+ viewManagers .addAll (viewManagersInPackage );
575+ }
539576 }
540577 Map <String , Object > constants =
541578 UIManagerModule .createConstants (viewManagers , new HashMap <>(), new HashMap <>());
0 commit comments