flutter PlatformView白屏

534 阅读1分钟

项目中使用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,可以解决白屏的问题。