flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

引擎初始化后短时间内,FlutterView多次attach、detach、attach引擎会导致无法渲染而白屏但可以响应触摸事件

Open JunhuaLin opened this issue 2 years ago • 6 comments

引擎初始化后短时间内,FlutterView多次attach、detach、attach引擎会导致无法渲染而白屏但可以相应触摸事件

具体的复现代码顺序如下:

FlutterBoostFragment是CachedEngineFragmentBuilder方法创建的对象

FlutterBoostFragment
---->init(这初始化Flutter引擎)

---->onCreateView
---->---->FlutterActivityAndFragmentDelegate.onCreateView(这里调用了FlutterView的attachFromFlutterEngine)
---->-->这里调用了FlutterView的detachFromFlutterEngine触发

---->didFragmentShow(这里调用了FlutterView的attachFromFlutterEngine触发)

Flutter v2.5.3 FlutterBoost v3.0-null-safety-preview.18

源码截图: image

JunhuaLin avatar Jul 11 '22 03:07 JunhuaLin

我这边用原生TabBar+flutter fragment就碰到了这个问题,试了无数种方案解决不了,最后把TabBar也放到Flutter实现就好了

Sunshow avatar Jul 11 '22 05:07 Sunshow

我这边用原生TabBar+flutter fragment就碰到了这个问题,试了无数种方案解决不了,最后把TabBar也放到Flutter实现就好了

这个解决方式是什么原理?没有想出是什么能成功

JunhuaLin avatar Jul 11 '22 06:07 JunhuaLin

当前我这里的解决方式如下:

【直接原因】 定位到是flutter引擎没有成功渲染到FlutterView中的FlutterTextureView上,但是Flutter侧Widget都是正常渲染,调试也能看见Widget树的结构

【解决方法】 故我这里先手动调了一下停止了Flutter的渲染的代码

flutterEngine?.renderer?.stopRenderingToSurface()

然后再页面显示时候会触发attach引擎重新启动渲染

didFragmentShow(这里调用了FlutterView的attachFromFlutterEngine触发了FlutterEngine渲染)

另外还可通过提前初始化FlutterEngine错开这个初始化时机,也是可以避免这个问题

【根本原因】 可能是引擎内部状态出了问题,导致渲染判断为不需要渲染导致的

JunhuaLin avatar Jul 11 '22 06:07 JunhuaLin

我这边用原生TabBar+flutter fragment就碰到了这个问题,试了无数种方案解决不了,最后把TabBar也放到Flutter实现就好了

这个解决方式是什么原理?没有想出是什么能成功

原理应该是这么实现以后 flutter boost 只是负责渲染了整个tabbar,就不存在多次attach和detach了,每个tab的页面是flutter内部渲染了

Sunshow avatar Jul 11 '22 07:07 Sunshow

另外我也是最近才发现这个问题,还以为是升级到了 flutter3 的原因兼容性问题导致的呢。 复现也不是每一次都能复现,在iPhone12和iPhone13上非常容易复现(因为性能好启动非常快),而在更老的机型基本不会触发,在模拟器上也极难触发,Android上没有这个问题。

Sunshow avatar Jul 11 '22 07:07 Sunshow

另外我也是最近才发现这个问题,还以为是升级到了 flutter3 的原因兼容性问题导致的呢。 复现也不是每一次都能复现,在iPhone12和iPhone13上非常容易复现(因为性能好启动非常快),而在更老的机型基本不会触发,在模拟器上也极难触发,Android上没有这个问题。

我在android也发现了这个问题。低端机型 我写了一个demo,启动app的时候,打开一个原生页面,然后立刻跳转到flutter的activity,白屏。如果我设置延时后跳转概率白屏。 不过我查的结果是,引擎还没初始化完成(startRoute未返回success),就调用了页面启动导致的。表现也是白屏,查flutter inspector也是有结构树,只是没有渲染。

版本和楼主一模一样

maxwell-nc avatar Jul 19 '22 00:07 maxwell-nc

我的问题在最新的flutter sdk>=3.0.5版本中已经修复了

JunhuaLin avatar Oct 25 '22 01:10 JunhuaLin

将flutter的sdk版本升级到3.0.5以上就行了吗 确认一下是flutterSDK不是boost是吧

hy20160705 avatar Feb 21 '23 07:02 hy20160705