Commit 1920e77f authored by 余玠's avatar 余玠

cherry pick from v1.12.13-hotfixes: 解决bug:https://github.com/flutter/flutter/issues/52455

parent a99debf4
...@@ -36,7 +36,8 @@ ...@@ -36,7 +36,8 @@
@interface FlutterViewController (bridgeToviewDidDisappear) @interface FlutterViewController (bridgeToviewDidDisappear)
- (void)flushOngoingTouches; - (void)flushOngoingTouches;
- (void)override_viewDidDisappear:(BOOL)animated; - (void)bridge_viewDidDisappear:(BOOL)animated;
- (void)bridge_viewWillAppear:(BOOL)animated;
@end @end
#pragma clang diagnostic push #pragma clang diagnostic push
...@@ -48,7 +49,20 @@ ...@@ -48,7 +49,20 @@
[super viewDidDisappear:animated]; [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 @end
#pragma pop
@interface FLBFlutterViewContainer () @interface FLBFlutterViewContainer ()
@property (nonatomic,strong,readwrite) NSDictionary *params; @property (nonatomic,strong,readwrite) NSDictionary *params;
...@@ -75,6 +89,13 @@ ...@@ -75,6 +89,13 @@
return self; 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 push
#pragma clang diagnostic ignored "-Wobjc-designated-initializers" #pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)initWithCoder:(NSCoder *)aDecoder{ - (instancetype)initWithCoder:(NSCoder *)aDecoder{
...@@ -190,6 +211,8 @@ static NSUInteger kInstanceCounter = 0; ...@@ -190,6 +211,8 @@ static NSUInteger kInstanceCounter = 0;
//For new page we should attach flutter view in view will appear //For new page we should attach flutter view in view will appear
//for better performance. //for better performance.
[self attatchFlutterEngine];
[BoostMessageChannel willShowPageContainer:^(NSNumber *result) {} [BoostMessageChannel willShowPageContainer:^(NSNumber *result) {}
pageName:_name pageName:_name
params:_params params:_params
...@@ -200,8 +223,8 @@ static NSUInteger kInstanceCounter = 0; ...@@ -200,8 +223,8 @@ static NSUInteger kInstanceCounter = 0;
[FlutterBoostPlugin sharedInstance].fParams = _params; [FlutterBoostPlugin sharedInstance].fParams = _params;
[self attatchFlutterEngine];
[super viewWillAppear:animated]; [super bridge_viewWillAppear:animated];
[self.view setNeedsLayout];//TODO:通过param来设定 [self.view setNeedsLayout];//TODO:通过param来设定
} }
...@@ -216,6 +239,8 @@ static NSUInteger kInstanceCounter = 0; ...@@ -216,6 +239,8 @@ static NSUInteger kInstanceCounter = 0;
pageName:_name pageName:_name
params:_params params:_params
uniqueId:self.uniqueIDString]; uniqueId:self.uniqueIDString];
//NOTES:务必在show之后再update,否则有闪烁; 或导致侧滑返回时上一个页面会和top页面内容一样
[self surfaceUpdated:YES];
[super viewDidAppear:animated]; [super viewDidAppear:animated];
} }
...@@ -228,13 +253,6 @@ static NSUInteger kInstanceCounter = 0; ...@@ -228,13 +253,6 @@ static NSUInteger kInstanceCounter = 0;
uniqueId:self.uniqueIDString]; uniqueId:self.uniqueIDString];
[[[UIApplication sharedApplication] keyWindow] endEditing:YES]; [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
[super viewWillDisappear:animated]; [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; ...@@ -244,14 +262,6 @@ static NSUInteger kInstanceCounter = 0;
pageName:_name pageName:_name
params:_params params:_params
uniqueId:self.uniqueIDString]; 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]; [self bridge_viewDidDisappear:animated];
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment