From 1920e77f93e92014133956db9b4d882a9cfce611 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=99=E7=8E=A0?= <xujian.xj@alibaba-inc.com>
Date: Sat, 21 Mar 2020 22:42:43 +0800
Subject: [PATCH] =?UTF-8?q?cherry=20pick=20from=20v1.12.13-hotfixes:=20?=
 =?UTF-8?q?=E8=A7=A3=E5=86=B3bug=EF=BC=9Ahttps://github.com/flutter/flutte?=
 =?UTF-8?q?r/issues/52455?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../container/FLBFlutterViewContainer.m       | 46 +++++++++++--------
 1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/ios/Classes/container/FLBFlutterViewContainer.m b/ios/Classes/container/FLBFlutterViewContainer.m
index e3aed44..9350b47 100755
--- a/ios/Classes/container/FLBFlutterViewContainer.m
+++ b/ios/Classes/container/FLBFlutterViewContainer.m
@@ -36,7 +36,8 @@
 
 @interface FlutterViewController (bridgeToviewDidDisappear)
 - (void)flushOngoingTouches;
-- (void)override_viewDidDisappear:(BOOL)animated;
+- (void)bridge_viewDidDisappear:(BOOL)animated;
+- (void)bridge_viewWillAppear:(BOOL)animated;
 @end
 
 #pragma clang diagnostic push
@@ -48,7 +49,20 @@
 
     [super viewDidDisappear:animated];
 }
+- (void)bridge_viewWillAppear:(BOOL)animated{
+//    TRACE_EVENT0("flutter", "viewWillAppear");
+
+//    if (_engineNeedsLaunch) {
+//      [_engine.get() launchEngine:nil libraryURI:nil];
+//      [_engine.get() setViewController:self];
+//      _engineNeedsLaunch = NO;
+//    }
+    [FLUTTER_APP inactive];
+    
+    [super viewWillAppear:animated];
+}
 @end
+#pragma pop
 
 @interface FLBFlutterViewContainer  ()
 @property (nonatomic,strong,readwrite) NSDictionary *params;
@@ -75,6 +89,13 @@
     return self;
 }
 
+- (instancetype)initWithProject:(FlutterDartProject*)projectOrNil
+                        nibName:(NSString*)nibNameOrNil
+                         bundle:(NSBundle*)nibBundleOrNil {
+    NSAssert(NO, @"unsupported init method!");
+    return nil;
+}
+
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wobjc-designated-initializers"
 - (instancetype)initWithCoder:(NSCoder *)aDecoder{
@@ -190,6 +211,8 @@ static NSUInteger kInstanceCounter = 0;
     //For new page we should attach flutter view in view will appear
     //for better performance.
  
+    [self attatchFlutterEngine];
+    
     [BoostMessageChannel willShowPageContainer:^(NSNumber *result) {}
                                             pageName:_name
                                               params:_params
@@ -200,8 +223,8 @@ static NSUInteger kInstanceCounter = 0;
     [FlutterBoostPlugin sharedInstance].fParams = _params;
     
  
-    [self attatchFlutterEngine];
-    [super viewWillAppear:animated];
+    
+    [super bridge_viewWillAppear:animated];
     [self.view setNeedsLayout];//TODO:通过param来设定
 }
 
@@ -216,6 +239,8 @@ static NSUInteger kInstanceCounter = 0;
                                            pageName:_name
                                              params:_params
                                            uniqueId:self.uniqueIDString];
+    //NOTES:务必在show之后再update,否则有闪烁; 或导致侧滑返回时上一个页面会和top页面内容一样
+    [self surfaceUpdated:YES];
     
     [super viewDidAppear:animated];
 }
@@ -228,13 +253,6 @@ static NSUInteger kInstanceCounter = 0;
                                                  uniqueId:self.uniqueIDString];
     [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
     [super viewWillDisappear:animated];
-    
-    //NOTES:因为UIViewController在present view后dismiss其页面的view disappear会发生在下一个页面view appear之后,从而让当前engine持有的vc inactive,此处可驱使其重新resume
-    if (![self.uniqueIDString isEqualToString:[(FLBFlutterViewContainer*)FLUTTER_VC uniqueIDString]])
-    {
-        [FLUTTER_APP resume];
-    }
-
 }
 
 
@@ -244,14 +262,6 @@ static NSUInteger kInstanceCounter = 0;
                                                 pageName:_name
                                                   params:_params
                                                 uniqueId:self.uniqueIDString];
-
-    //NOTES:因为UIViewController在present view后dismiss其页面的view disappear会发生在下一个页面view appear之后,导致当前engine持有的VC被surfaceUpdate(NO),从而销毁底层的raster。此处是考虑到这种情形,重建surface
-    if (FLUTTER_VC.beingPresented || self.beingDismissed /*|| ![self.uniqueIDString isEqualToString:[(FLBFlutterViewContainer*)FLUTTER_VC uniqueIDString]]*/)
-    {
-        [FLUTTER_APP resume];
-        [(FLBFlutterViewContainer*)FLUTTER_VC surfaceUpdated:YES];
-    }
-    
     [self bridge_viewDidDisappear:animated];
 }
 
-- 
2.26.2