前言😊

因为一些原因,在学习flutter的时候极其混乱,导致很多问题并没有记录下来。因为最开始学习它还是在高三上的空闲时间(大概是),使用的设备也是极其拉胯的旧时代产物(甚至打开Chrome需要5s以上)。配置的环境也极其混乱,很多问题现在的设备完全不会遇到的,在那个时候也通通遇到了。

我希望我的学习节奏由自己控制,因此我在学校技术课程(c++)以外试图同时学习多门语言和相关技术(flutter、uikit-swift、go-gin-gorm等),因为是新手,加之长期以来容易放鸽子的坏习惯,导致感觉上学校的大型社团课(比如go)不如自己折腾 (其实也可以理解为一下子讲太多鼠脑过载) 。所以在目前大一有时间的情况下,我会不定期抽时间同时学习多个技术,虽然不知道到底结果能否如愿,但是我仍然觉得有记录下来的必要(也是因为健忘的原因,不记下来过段时间就忘记了,看自己写的或者收集的东西更容易快速回忆,也能让自己尽可能多理解)。
接下来我将继续复习和学习flutter,并且带着uikit-swift和go-gin继续折腾。对于flutter的部分,大概会是零散的笔记和实际尝试。

理念

widget

一切都是widget。
所有的东西,视图,活动,功能,应用,布局...都是widget
flutter也需要结构化组织视图数据,提供给渲染引擎才能显示页面。
和其他框架一样,flutter也需要视图树,而 Flutter 将视图树的概念进行了扩展,把视图数据的组织和
渲染抽象为三部分,即 Widget,Element 和 RenderObject

将widget视为组件,作为实现控件的基本单位。里面存储的是有关视图渲染的配置信息,包括布局、渲染属性、事件响应信息等
Flutter 将 Widget 设计成不可变的,所以当视图渲染的配置信息发生变化时,Flutter 会选择重建 Widget 树的方式进行数据更新,以数据驱动 UI 构建的方式简单高效。这样做的缺点是,因为涉及到大量对象的销毁和重建,所以会对垃圾回收造成压力。不过,Widget 本身并不涉及实际渲染位图,所以它只是一份轻量级的数据结构,重建的成本很低。

element

Element 是 Widget 的一个实例化对象,它承载了视图构建的上下文数据,是连接结构化的配置信息到完成最终渲染的桥梁。
Flutter 渲染过程,可以分为这么三步:首先,通过 Widget 树生成对应的 Element 树;然后,创建相应的 RenderObject 并关联到 Element.renderObject 属性上;最后,构建成 RenderObject 树,以完成最终的渲染。

Element 同时持有 Widget 和 RenderObject。而无论是 Widget 还是Element,其实都不负责最后的渲染,只负责发号施令,真正去干活儿的只有RenderObject。

既然都是发号施令,那增加中间的这层Element 树呢原因?直接由 Widget 命令 RenderObject 去干活儿不好吗?
可以,但这样做会极大地增加渲染带来的性能损耗。因为 Widget 具有不可变性,但 Element 却是可变的。实际上,Element 树这一层将Widget 树的变化做了抽象,可以只将真正需要修改的部分同步到真实的 RenderObject 树中,最大程度降低对真实渲染视图的修改,提高渲染效率,而不是销毁整个渲染视图树重建。

###RenderObject
主要负责实现视图渲染的对象
布局和绘制在 RenderObject 中完成,Flutter 采用深度优先机制遍历渲染对象树,确定树中各个对象的位置和尺寸,并把它们绘制到不同的图层上。绘制完毕后,合成和渲染的工作则交给 Skia 搞定。
####RenderObjectWidget
StatelessWidget 和 StatefulWidget 只是用来组装控件的容器,并不负责组件最后的布局和绘制。在 Flutter 中,布局和绘制工作实际上是在 Widget 的另一个子类RenderObjectWidget 内完成的。

RenderObjectWidget 是一个抽象类。我们通过源码可以看到,这个类中同时拥有创建Element、RenderObject,以及更新 RenderObject 的方法。但实际上,RenderObjectWidget 本身并不负责这些对象的创建与更新。对于 Element 的创建,Flutter 会在遍历 Widget 树时,调用 createElement 去同步Widget 自身配置,从而生成对应节点的 Element 对象。而对于 RenderObject 的创建与更新,其实是在 RenderObjectElement 类中完成的。

感受理念,暂不深究
这部分大量采用第三方解释。