iOS原生工程嵌入多个FLBFlutterViewContainer
页面,如果有持久存在的FLBFlutterViewContainer
,会导致进入其他FLBFlutterViewContainer
页面,再回到持久存在的FLBFlutterViewContainer
时,持久存在的FLBFlutterViewContainer
会失去响应,出现类似于卡死的现象,当点击界面的时候,会响应上个FLBFlutterViewContainer
界面的逻辑。
问题原因
可以看到在容器 willAppear 的时候会调用 attatchFlutterEngine 方法,其用于切换 engine 的 viewController。即,每次打开 Flutter Page 的时候,刚生成的承载它的容器 FlutterViewController 都会被挂载在 engine 上。是的,Flutter Boost 是通过不断切换 engine 的 viewController 来展示 Flutter 容器和页面的。
Flutter 混合栈方案
总体来讲有几种种方案:
- 多 Activity 多 FlutterView 方案,即多引擎方案
- 共享 FlutterView,代表为闲鱼 hybrid_stack_manager
- 共享 FlutterNativieView,代表为 微店
- 共享 FlutterView升级版,代表为闲鱼 Flutter_Boost
- 共享 Isolate,代表为 头条
其实核心思想都是公用同一个 FlutterEngine,避免不必要的资源浪费,优化性能及页面跳转体验,并实现多端逻辑统一。
即将开源 | 让Flutter真正支持View级别的混合开发
[fromVC beginAppearanceTransition:NO animated:YES];
[fromVC endAppearanceTransition];
可以尝试这两个函数. 目测可以解决僵死问题 @christyuj
解决方案
//激活当前 flutterVC 接受交互
flutterVC.beginAppearanceTransition(true, animated: true)
flutterVC.endAppearanceTransition()
经过这样处理,就可以激活失去响应的,持久存在的FLBFlutterViewContainer页面,但是这样处理会引起页面上移的问题。
上移问题排查
尝试使用以下方案解决
- 尝试刷新,无效
flutterVC.surfaceUpdated(true)
- 尝试重设
engine.viewController
,无效
flutterVC.engine.viewController = self.flutterVC
- 尝试重新调用
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()
网友评论