美文网首页
FLBFlutterViewContainer持久存在失去响应卡

FLBFlutterViewContainer持久存在失去响应卡

作者: name007 | 来源:发表于2020-07-09 23:56 被阅读0次

    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()
    

    相关文章

      网友评论

          本文标题:FLBFlutterViewContainer持久存在失去响应卡

          本文链接:https://www.haomeiwen.com/subject/vzzecktx.html