flutter_boost
flutter_boost copied to clipboard
引擎初始化后短时间内,FlutterView多次attach、detach、attach引擎会导致无法渲染而白屏但可以响应触摸事件
引擎初始化后短时间内,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
源码截图:
我这边用原生TabBar+flutter fragment就碰到了这个问题,试了无数种方案解决不了,最后把TabBar也放到Flutter实现就好了
我这边用原生TabBar+flutter fragment就碰到了这个问题,试了无数种方案解决不了,最后把TabBar也放到Flutter实现就好了
这个解决方式是什么原理?没有想出是什么能成功
当前我这里的解决方式如下:
【直接原因】 定位到是flutter引擎没有成功渲染到FlutterView中的FlutterTextureView上,但是Flutter侧Widget都是正常渲染,调试也能看见Widget树的结构
【解决方法】 故我这里先手动调了一下停止了Flutter的渲染的代码
flutterEngine?.renderer?.stopRenderingToSurface()
然后再页面显示时候会触发attach引擎重新启动渲染
didFragmentShow(这里调用了FlutterView的attachFromFlutterEngine触发了FlutterEngine渲染)
另外还可通过提前初始化FlutterEngine错开这个初始化时机,也是可以避免这个问题
【根本原因】 可能是引擎内部状态出了问题,导致渲染判断为不需要渲染导致的
我这边用原生TabBar+flutter fragment就碰到了这个问题,试了无数种方案解决不了,最后把TabBar也放到Flutter实现就好了
这个解决方式是什么原理?没有想出是什么能成功
原理应该是这么实现以后 flutter boost 只是负责渲染了整个tabbar,就不存在多次attach和detach了,每个tab的页面是flutter内部渲染了
另外我也是最近才发现这个问题,还以为是升级到了 flutter3 的原因兼容性问题导致的呢。 复现也不是每一次都能复现,在iPhone12和iPhone13上非常容易复现(因为性能好启动非常快),而在更老的机型基本不会触发,在模拟器上也极难触发,Android上没有这个问题。
另外我也是最近才发现这个问题,还以为是升级到了 flutter3 的原因兼容性问题导致的呢。 复现也不是每一次都能复现,在iPhone12和iPhone13上非常容易复现(因为性能好启动非常快),而在更老的机型基本不会触发,在模拟器上也极难触发,Android上没有这个问题。
我在android也发现了这个问题。低端机型 我写了一个demo,启动app的时候,打开一个原生页面,然后立刻跳转到flutter的activity,白屏。如果我设置延时后跳转概率白屏。 不过我查的结果是,引擎还没初始化完成(startRoute未返回success),就调用了页面启动导致的。表现也是白屏,查flutter inspector也是有结构树,只是没有渲染。
版本和楼主一模一样
我的问题在最新的flutter sdk>=3.0.5版本中已经修复了
将flutter的sdk版本升级到3.0.5以上就行了吗 确认一下是flutterSDK不是boost是吧