我们的项目是flutter和Native混合的开发项目,切换tabbar时,发现tabbar上对应的flutter页面会偶尔有页面闪烁现象,包括使用Flutter_boost展示的flutter页面,再pop返回时,也会有闪烁现象。
在FLBFlutterViewContainer的源码中,发现viewDidAppear中有这样的代码:
[BoostMessageChannel didShowPageContainer:^(NSNumber *result) {}
pageName:_name
params:_params
uniqueId:self.uniqueIDString];
//NOTES:务必在show之后再update,否则有闪烁
[self surfaceUpdated:YES];
第一行代码点进去看下,能看出来它就是一个通过MethodChannel去fluter加载页面的,但是这个方法时异步的,就不能保证[self surfaceUpdated:YES];肯定会在show之后才执行了,这也就产生了提示的闪烁问题。
+ (void)didShowPageContainer:(void (^)(NSNumber *))result pageName:(NSString *)pageName params:(NSDictionary *)params uniqueId:(NSString *)uniqueId
{
if ([pageName isEqualToString:kIgnoreMessageWithName]) {
return;
}
NSMutableDictionary *tmp = [NSMutableDictionary dictionary];
if(pageName) tmp[@"pageName"] = pageName;
if(params) tmp[@"params"] = params;
if(uniqueId) tmp[@"uniqueId"] = uniqueId;
[self.methodChannel invokeMethod:@"didShowPageContainer" arguments:tmp result:^(id tTesult) {
if (result) {
result(tTesult);
}
}];
}
具体为什么闪烁还搞不明白呢,刚接触flutter水平不够没能力深究,在此记录一下,我的解决办法就是创建一个FLBFlutterViewContainer的分类,进行方法交 换,重写一个方法dd_surfaceUpdated:和原有的方法surfaceUpdated:进行交换,加很短的延时就可以避免这个闪烁问题了,是不是解决所有的闪烁问题不清楚,但是能解决我上面提到的闪烁bug了,时间不能太久,不然flutter页面加载会有明显的空白时间。
-(void)dd_surfaceUpdated:(BOOL)appeared{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self dd_surfaceUpdated:appeared];
});
}