diff --git a/.gitignore b/.gitignore index 730c7e4ce18fb32f28a5ec823077700012b74ce0..870f951370586ea93b915ea9852a313e588ca207 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ tags Thumbs.db .idea pubspec.lock +.vscode/ diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h b/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h index 52e8017a299af461f4f46f1927a692d4d21778fc..0254139847e3a15681d58def68c5424bbbe32137 100644 --- a/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h +++ b/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h @@ -78,7 +78,7 @@ FLUTTER_EXPORT * tree-shaken by the Dart compiler. * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise. */ -- (bool)runWithEntrypoint:(NSString*)entrypoint; +- (BOOL)runWithEntrypoint:(NSString*)entrypoint; /** * Runs a Dart program on an Isolate using the specified entrypoint and Dart library, @@ -95,7 +95,7 @@ FLUTTER_EXPORT * this will default to the same library as the `main()` function in the Dart program. * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise. */ -- (bool)runWithEntrypoint:(NSString*)entrypoint libraryURI:(NSString*)uri; +- (BOOL)runWithEntrypoint:(NSString*)entrypoint libraryURI:(NSString*)uri; /** * Sets the `FlutterViewController` for this instance. The FlutterEngine must be diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm index 33ca6477bd06aae7a2adcac526218092953b46fa..e25f2db853bc95fac9958a12550cd83980aad33e 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm @@ -264,10 +264,10 @@ })); } -- (bool)runWithEntrypoint:(NSString*)entrypoint libraryURI:(NSString*)libraryURI { +- (BOOL)createShell:(NSString*)entrypoint libraryURI:(NSString*)libraryURI { if (_shell != nullptr) { FML_LOG(WARNING) << "This FlutterEngine was already invoked."; - return false; + return NO; } static size_t shellCount = 1; @@ -351,13 +351,20 @@ << entrypoint.UTF8String; } else { [self maybeSetupPlatformViewChannels]; + } + + return _shell != nullptr; +} + +- (BOOL)runWithEntrypoint:(NSString*)entrypoint libraryURI:(NSString*)libraryURI { + if ([self createShell:entrypoint libraryURI:libraryURI]) { [self launchEngine:entrypoint libraryURI:libraryURI]; } return _shell != nullptr; } -- (bool)runWithEntrypoint:(NSString*)entrypoint { +- (BOOL)runWithEntrypoint:(NSString*)entrypoint { return [self runWithEntrypoint:entrypoint libraryURI:nil]; } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h index 86d1fc736eb32aaf7050d3737721dce4ca1fdd25..196516be4f0201919804ff4137d4815e7a997044 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h @@ -42,6 +42,7 @@ - (shell::FlutterPlatformViewsController*)platformViewsController; - (FlutterTextInputPlugin*)textInputPlugin; - (void)launchEngine:(NSString*)entrypoint libraryURI:(NSString*)libraryOrNil; +- (BOOL)createShell:(NSString*)entrypoint libraryURI:(NSString*)libraryOrNil; @end diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 9c160cef2903414f7e4d4e1877c4e1afc5f32c2f..f557d3433aef24178fce8fc0c55df70ec99236b0 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -37,6 +37,7 @@ blink::ViewportMetrics _viewportMetrics; BOOL _initialized; BOOL _viewOpaque; + BOOL _engineNeedsLaunch; } #pragma mark - Manage and override all designated initializers @@ -49,6 +50,7 @@ if (self) { _viewOpaque = YES; _engine.reset([engine retain]); + _engineNeedsLaunch = NO; _flutterView.reset([[FlutterView alloc] initWithDelegate:_engine opaque:self.isViewOpaque]); _weakFactory = std::make_unique>(self); @@ -68,8 +70,8 @@ _weakFactory = std::make_unique>(self); _engine.reset([[FlutterEngine alloc] initWithName:@"io.flutter" project:projectOrNil]); _flutterView.reset([[FlutterView alloc] initWithDelegate:_engine opaque:self.isViewOpaque]); - [_engine.get() runWithEntrypoint:nil]; - [_engine.get() setViewController:self]; + [_engine.get() createShell:nil libraryURI:nil]; + _engineNeedsLaunch = YES; [self performCommonViewControllerInitialization]; } @@ -371,6 +373,12 @@ - (void)viewWillAppear:(BOOL)animated { TRACE_EVENT0("flutter", "viewWillAppear"); + if (_engineNeedsLaunch) { + [_engine.get() launchEngine:nil libraryURI:nil]; + [_engine.get() setViewController:self]; + _engineNeedsLaunch = NO; + } + // Only recreate surface on subsequent appearances when viewport metrics are known. // First time surface creation is done on viewDidLayoutSubviews. if (_viewportMetrics.physical_width)