flutter学习笔记-设计原理

262 阅读2分钟

flutter主要技术链:

  • C++实现的 Flutter engine。   主要包括Skia(二维图形库)、Dart VM(dart runtime)、Text(文本渲染)等。
  • Dart 实现的 Framework组成。   Animation Painting Widgets Gesture


  1. 一个进程里面最多只会初始化一个Dart VM。
  2. 然而一个进程可以有多个Flutter Engine。
  3. 多个Engine共享同一个Dart VM。


官方建议(未实现):支持同一个引擎绘制多窗口的能力,至少逻辑上FlutterViewController是共享同一个引擎资源的。         换句话说:所有绘制窗口共享同一个主Isolate。


目前多引擎问题现象:从Flutter page1 -> Native page2 -> Flutter page3 。期间为间隔的flutter界面初始化新的引擎。

坑点:

  1. 频繁从native 切换到 flutter view时,flutter engine的数量会线性增加,flutter engine本身就是个比较重的对象。      
  2. 每个engine里面的isolate是独立的,图片等资源内存压力大。
  3. 通信插件,容易混乱,不好维护。
  4. 界面通信复杂度


闲鱼---混合技术方案v2.0---FlutterBoost

主要针对界面实现,内存管理部分:

v1.0 :维护了一个Navigator栈结构。   Flutter在底层提供了让你自定义Navigator的接口,我们自己实现了一个管理多个Navigator对象。 当前最多只有一个可见的Flutter Navigator,这个Navigator所包含的界面也就是我们当前可见容器所对应的页面。

v2.0 :Native容器与Flutter容器(Navigator)是一一对应的,生命周期也是同步的。 两个容器通过相同的id关联起来。  Native容器状态变化,驱动 Flutter容器变化。我们用一个简单的例子描述一个新页面创建的过程:

  1.  创建 Native 容器(iOS ViewController,Android Activity or Fragment)。
  2.  Native 容器通过消息机制通知 Flutter Coordinator 新的容器被创建。
  3.  Flutter Container Manager 进而得到通知,负责创建出对应的 Flutter 容器,并且在其中装载对应的 Widget 页面。
  4. 当 Native 容器展示到屏幕上时,容器发消息给 Flutter Coordinator 通知展示页面的 id.
  5.  Flutter Container Manager 找到对应 id 的 Flutter Container 并将其设置为前台可见容器。
    这就是一个新页面创建的主要逻辑,销毁和进入后台等操作也类似有 Native 容器事件去进行驱动。