flutter主要技术链:
- C++实现的 Flutter engine。 主要包括Skia(二维图形库)、Dart VM(dart runtime)、Text(文本渲染)等。
- Dart 实现的 Framework组成。 Animation Painting Widgets Gesture
- 一个进程里面最多只会初始化一个Dart VM。
- 然而一个进程可以有多个Flutter Engine。
- 多个Engine共享同一个Dart VM。
官方建议(未实现):支持同一个引擎绘制多窗口的能力,至少逻辑上FlutterViewController是共享同一个引擎资源的。 换句话说:所有绘制窗口共享同一个主Isolate。
目前多引擎问题现象:从Flutter page1 -> Native page2 -> Flutter page3 。期间为间隔的flutter界面初始化新的引擎。
坑点:
- 频繁从native 切换到 flutter view时,flutter engine的数量会线性增加,flutter engine本身就是个比较重的对象。
- 每个engine里面的isolate是独立的,图片等资源内存压力大。
- 通信插件,容易混乱,不好维护。
- 界面通信复杂度
闲鱼---混合技术方案v2.0---FlutterBoost
主要针对界面实现,内存管理部分:
v1.0 :维护了一个Navigator栈结构。 Flutter在底层提供了让你自定义Navigator的接口,我们自己实现了一个管理多个Navigator对象。 当前最多只有一个可见的Flutter Navigator,这个Navigator所包含的界面也就是我们当前可见容器所对应的页面。
v2.0 :Native容器与Flutter容器(Navigator)是一一对应的,生命周期也是同步的。 两个容器通过相同的id关联起来。 Native容器状态变化,驱动 Flutter容器变化。我们用一个简单的例子描述一个新页面创建的过程:
- 创建 Native 容器(iOS ViewController,Android Activity or Fragment)。
- Native 容器通过消息机制通知 Flutter Coordinator 新的容器被创建。
- Flutter Container Manager 进而得到通知,负责创建出对应的 Flutter 容器,并且在其中装载对应的 Widget 页面。
- 当 Native 容器展示到屏幕上时,容器发消息给 Flutter Coordinator 通知展示页面的 id.
- Flutter Container Manager 找到对应 id 的 Flutter Container 并将其设置为前台可见容器。