项目中使用flutter_boost混合开发,当A页面中使用platformview,开启新容器跳转到flutter B页面,platformView会出现短暂的白屏,从A页面跳转native页面不会出现
根据表象首先猜测是单引擎导致的。 flutter A页面跳转到其他页面时都会触发SceneBuilder::pushTransform重新渲染一次A页面。
void SceneBuilder::pushTransform(Dart_Handle layer_handle,
tonic::Float64List& matrix4,
fml::RefPtr<EngineLayer> oldLayer) {
SkMatrix sk_matrix = ToSkMatrix(matrix4);
auto layer = std::make_shared<flutter::TransformLayer>(sk_matrix);
PushLayer(layer);
// matrix4 has to be released before we can return another Dart object
matrix4.Release();
EngineLayer::MakeRetained(layer_handle, layer);
if (oldLayer && oldLayer->Layer()) {
layer->AssignOldLayer(oldLayer->Layer().get());
}
}
flutter A页面在创建新容器push到flutter B页面时,首先会触发viewDidLayoutSubviews,方法内部会修改engine对应的viewController flutterView,SceneBuilder::pushTransform是在viewDidLayoutSubviews之后还会触发,而platformView是在native渲染,重新渲染A页面时就找不到对应的platformView,导致白屏的问题。push到非flutter页面时不会触发surfaceUpdated,所以不会出现白屏的问题
- (void)viewDidLayoutSubviews {
...
if (firstViewBoundsUpdate && applicationIsActive && _engine) {
[self surfaceUpdated:YES];
}
...
}
- (void)surfaceUpdated:(BOOL)appeared {
if (appeared) {
[self installFirstFrameCallback];
[_engine.get() platformViewsController]->SetFlutterView(_flutterView.get());
[_engine.get() platformViewsController]->SetFlutterViewController(self);
[_engine.get() iosPlatformView]->NotifyCreated();
}
}
解决办法:一开始的方案是在viewWillAppear中调用sufaceUpdated,但是在release环境中会出现卡死的现象。另一方案是[super bridge_viewWillAppear:animated]; 改为[super viewWillAppear:animated]; [super viewWillAppear:animated]; 会调用父类的方法,父类方法又会调用sufaceUpdated,可以解决白屏的问题。