Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件。2017年5月发布第一个版本,并且在2018年12月初发布1.0稳定版,2019年MWC上发布1.2版本。
在Flutter之前已经有好多跨平台UI解决方案,基于WebView的Cordova,基于JavaScript渲染成原生控件的React Native。而Flutter完全颠覆了以往的依赖,使用Skia作为2D渲染引擎,自建UI。
3.1Flutter布局渲染的整理流程
Flutter界面的渲染过程分为三个阶段:布局、绘制、合成,布局和绘制在Flutter框架中完成,合成则交由引擎负责。
因为直接交付给GPU多图层视图数据是低效的,可能会重复绘制,所以还需要进行一步图层合成,最后才交由引擎负责光栅化视图,所以添加了合成图层。
用户操作->更新动画->构建控件->布局->绘制图层->合成图层->光栅化
3.2虚拟DOM技术
Widget——>Element——>RenderObject
Widget树就是我们的UI组件树,但这个只是一种描述信息,渲染引擎不认识,RenderObject树才是渲染引擎真的认识的,我们需要将Widget转化为能用来渲染视图的RenderObject。
虚拟DOM解决了一个重要的矛盾:就是DOM操作的性能损耗与频繁进行局部DOM操作的矛盾。
没有用虚拟DOM之前,DOM会在每次元素更新来到之时渲染一次DOM
用了虚拟DOM后,虚拟DOM会先汇总各个元素的更新情况,通过diff算法计算出与原来DOM树的差异,最后通过一次DOM更新解决。
3.3构建widget
您可以通过实现widget的build返回widget树(或层次结构)来定义widget的独特特性。这棵树更具体地表示了用户界面的widget层次。例如,工具栏widget的build函数可能返回一个包含一些文本和各种按钮的水平布局。然后,框架递归地构建widget,直到将所有的widget构建完成,然后framework将他们一起添加到树中。
widget的构建函数一般没有副作用。每当它被要求构建时,widget应该返回一个新的widget树,无论widget以前返回的是什么。framework回将之前的构建与当前的构建比较并确定需要对用户界面进行哪些修改。
这种自动化比较非常有效,可以实现高性能的交互式应用程序。而构建函数的设计则着重于声明widget是由什么构成的,而不是将用户界面从一个状态更新到另一个状态,从而简化了代码。
4.1支持JIT和AOT运行模式
4.2 Flutter中一切皆widget
之前的文章里也有强调过,widget是Flutter应用程序的构建块。每个widget都是用户界面一部分的不可变声明。与其他将视图、控制器、布局和其他属性分离的框架不同,Flutter具有一致的统一对象模型:widget。
4.3Flutter编写并行/并发应用程序
Flutter支持isolates。isolates是Flutter虚拟机中的独立堆,他们可以并行运行(通常作为单独的线程实现),isolates通过发送和接收异步消息进行通信。