-
Notifications
You must be signed in to change notification settings - Fork 24.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(RCTAppDelegate): Implement
RCTRootViewFactory
(#42263)
Summary: This PR implements `RCTRootViewFactory` a utility class (suggested by cipolleschi) that returns proper RCTRootView based on the current environment state (new arch/old arch/bridgeless). This class aims to preserve background compatibility by implementing a configuration class forwarding necessary class to RCTAppDelegate. This PR leverages the `RCTRootViewFactory` in `RCTAppDelegate` for the default initialization of React Native (greenfield). Here is an example of creating a Brownfield integration (without RCTAppDelegate) using this class (can be later added to docs): 1. Store reference to `rootViewFactory` and to `UIWindow` `AppDelegate.h`: ```objc interface AppDelegate : UIResponder <UIApplicationDelegate> property(nonatomic, strong) UIWindow* window; property(nonatomic, strong) RCTRootViewFactory* rootViewFactory; end ``` 2. Create an initial configuration using `RCTRootViewFactoryConfiguration` and initialize `RCTRootViewFactory` using it. Then you can use the factory to create a new `RCTRootView` without worrying about old arch/new arch/bridgeless. `AppDelegate.mm` ```objc implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions { // Create configuration RCTRootViewFactoryConfiguration *configuration = [[RCTRootViewFactoryConfiguration alloc] initWithBundleURL:self.bundleURL newArchEnabled:self.fabricEnabled turboModuleEnabled:self.turboModuleEnabled bridgelessEnabled:self.bridgelessEnabled]; // Initialize RCTRootViewFactory self.rootViewFactory = [[RCTRootViewFactory alloc] initWithConfiguration:configuration]; // Create main root view UIView *rootView = [self.rootViewFactory viewWithModuleName:@"RNTesterApp" initialProperties:@{} launchOptions:launchOptions]; // Set main window as you prefer for your Brownfield integration. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [UIViewController new]; rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; // Later in the codebase you can initialize more rootView's using rootViewFactory. return YES; } end ``` bypass-github-export-checks [INTERNAL] [ADDED] - Implement RCTRootViewFactory Pull Request resolved: #42263 Test Plan: Check if root view is properly created on app initialization Reviewed By: dmytrorykun Differential Revision: D53179625 Pulled By: cipolleschi fbshipit-source-id: 9bc850965ba30d84ad3e67d91dd888f0547c2136
- Loading branch information
1 parent
6440e35
commit 66b1cfe
Showing
6 changed files
with
441 additions
and
144 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.