From 1a01274d0b462675efe0e2b3a0250b59d4c1e4e1 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 6 Nov 2018 17:15:11 -0800 Subject: [PATCH] fix setInitialRoute (flutter/engine#6774) * fix setInitialRoute --- engine/src/flutter/.gitignore | 1 + .../darwin/ios/framework/Headers/FlutterEngine.h | 4 ++-- .../darwin/ios/framework/Source/FlutterEngine.mm | 13 ++++++++++--- .../ios/framework/Source/FlutterEngine_Internal.h | 1 + .../ios/framework/Source/FlutterViewController.mm | 12 ++++++++++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/engine/src/flutter/.gitignore b/engine/src/flutter/.gitignore index 730c7e4ce1..870f951370 100644 --- a/engine/src/flutter/.gitignore +++ b/engine/src/flutter/.gitignore @@ -20,3 +20,4 @@ tags Thumbs.db .idea pubspec.lock +.vscode/ diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h b/engine/src/flutter/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h index 52e8017a29..0254139847 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h +++ b/engine/src/flutter/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/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm index 33ca6477bd..e25f2db853 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm +++ b/engine/src/flutter/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/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h index 86d1fc736e..196516be4f 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h +++ b/engine/src/flutter/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/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 9c160cef29..f557d3433a 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/engine/src/flutter/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)