Skip to content

Commit 506ea9e

Browse files
Lulu Wucortinico
authored andcommitted
Fall back to eager view manage loading (#41165)
Summary: Pull Request resolved: #41165 Currently Bridgeless forces lazy view manager loading, each ReactPackage must implement ```ViewManagerOnDemandReactPackage```. This can bring extra hassle for OSS users in migration. This diff add backward compatibility by falling back to eager view manage loading, after detecting any ReactPackage of current application NOT a subclass of ```ViewManagerOnDemandReactPackage```. Changelog: [Android][Changed] - Fall back to eager view manage loading for Bridgeless Reviewed By: cortinico Differential Revision: D50556405 fbshipit-source-id: 32357d1934068d0fa0f2b7cb46b54f2f41b3e24f
1 parent 2db4ce2 commit 506ea9e

File tree

1 file changed

+41
-4
lines changed
  • packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime

1 file changed

+41
-4
lines changed

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactInstance.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import java.util.List;
7272
import java.util.Map;
7373
import java.util.Set;
74+
import java.util.concurrent.ConcurrentHashMap;
7475
import 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

Comments
 (0)