FLBFlutterViewContainer持久存在失去响应卡死问题解决

iOS原生工程嵌入多个FLBFlutterViewContainer页面,如果有持久存在FLBFlutterViewContainer,会导致进入其他FLBFlutterViewContainer页面,再回到持久存在FLBFlutterViewContainer时,持久存在的FLBFlutterViewContainer会失去响应,出现类似于卡死的现象,当点击界面的时候,会响应上个FLBFlutterViewContainer界面的逻辑。

问题原因

Flutter 混合开发框架模式探索

可以看到在容器 willAppear 的时候会调用 attatchFlutterEngine 方法,其用于切换 engine 的 viewController。即,每次打开 Flutter Page 的时候,刚生成的承载它的容器 FlutterViewController 都会被挂载在 engine 上。是的,Flutter Boost 是通过不断切换 engine 的 viewController 来展示 Flutter 容器和页面的。

Flutter 混合栈管理

Flutter 混合栈方案

总体来讲有几种种方案:

  1. 多 Activity 多 FlutterView 方案,即多引擎方案
  2. 共享 FlutterView,代表为闲鱼 hybrid_stack_manager
  3. 共享 FlutterNativieView,代表为 微店
  4. 共享 FlutterView升级版,代表为闲鱼 Flutter_Boost
  5. 共享 Isolate,代表为 头条
    其实核心思想都是公用同一个 FlutterEngine,避免不必要的资源浪费,优化性能及页面跳转体验,并实现多端逻辑统一。

即将开源 | 让Flutter真正支持View级别的混合开发

可以尝试这两个函数. 目测可以解决僵死问题

[fromVC beginAppearanceTransition:NO animated:YES];
[fromVC endAppearanceTransition];
可以尝试这两个函数. 目测可以解决僵死问题 @christyuj

修正present问题并添加测试用例

解决方案

//激活当前 flutterVC 接受交互
flutterVC.beginAppearanceTransition(true, animated: true)
flutterVC.endAppearanceTransition()

经过这样处理,就可以激活失去响应的,持久存在的FLBFlutterViewContainer页面,但是这样处理会引起页面上移的问题。

上移问题排查

尝试使用以下方案解决

  1. 尝试刷新,无效
flutterVC.surfaceUpdated(true)
  1. 尝试重设engine.viewController,无效
flutterVC.engine.viewController = self.flutterVC
  1. 尝试重新调用setName,无效
flutterVC.setName("flutter://reviews/reviewfilter", params: [:])

4.尝试界面重绘,无效

flutterVC.view.setNeedsDisplay()
flutterVC.view.setNeedsFocusUpdate()

5.尝试界面重布局,有效!

flutterVC.view.setNeedsLayout()
flutterVC.view.layoutIfNeeded()

最终解决问题关键代码

//激活当前 flutterVC 接受交互
flutterVC.beginAppearanceTransition(true, animated: true)
flutterVC.endAppearanceTransition()
//重新布局页面,防止由于共用 engine 造成的页面上移问题
flutterVC.view.setNeedsLayout()
flutterVC.view.layoutIfNeeded()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容