什么是三棵树?颤动中的小部件是核心,一切都是小部件,但是还有其他两个元素可以一起使用:元素和renderObject。由于它们都有树结构,因此通常称它们为三棵树。
在开发颤音应用程序的过程中,widget无疑是小部件,这是“描述” flutter UI的基本单位。Flutter使用小部件层中使用相同的概念(一个小部件)来表示图形,布局(位置和大小),用户互动,状态管理,主题,动画和屏幕上的导航。
设计小部件时,Google还赋予了它一些独特的特征:
小部件可以分为3个类别:“组件小部件”,“代理窗口小部件”和“ Renderer Widget”,但是只有渲染窗口小部件将转换为渲染对象并最终在UI上显示。
您可以在小部件注释开头看到:
此评论阐明了小部件的本质:用于配置元素,小部件本质上是UI的配置信息(具有某些业务逻辑)。
我们知道,小部件本质上是UI(静态,不变)的配置数据,而元素是由小部件生成的“实例”。两者之间的关系就像json和对象。相同的配置(小部件)可以生成多个实例(元素),这些实例可以插入树上的不同位置。
同样,元素评论中的第一句话也可以看到:
元素之间实际上有一个真实的树“元素树”。元素有两个主要职责:
“组件元素” - 组合元素,“组件窗口小部件”和“代理小部件”,与此类型相对应,这些特征是需要通过构建方法来创建与sub -nodes相对应的小部件。在同一时间,此类型元素只有一个子节点(单个孩子);“渲染器元素” - 渲染元素,对应于“渲染器窗口小部件”。
正式文档中有一段
这意味着可以将小部件大致认为是Android中的视图,因为它们可以描述UI,但是确切地说,它们并不相等。
实际上,RenderObject更像是Android中的视图。RenderObject是实际参与图纸的对象。它具有类似于视图的渲染过程,包括许多方法。
-to -definee fore -perforn -perform -perform -litron -late -late -conform -conblerEsertwo nodes布局限制量度()的布局表明,sub -node的布局协议限制为sub -nonode的布局协议仅限于布局协议实施(例如坐标系)未定义。Flutter的本机实现是Renderbox,并且大多数小部件都是基于它的。
首先观察以下代码片段,它代表一个简单的小部件结构:
当颤动需要绘制此代码片段时,该框架将调用构建()方法,以根据当前的应用程序状态返回窗口小部件subtreas以绘制UI.in ui.in this Process,build()方法可以根据该过程介绍新的小部件。在必要时进行状态。在上述示例中,容器的颜色和子女是典型的示例。我们可以查看容器的源代码。您会看到,当颜色属性不是空时,将添加颜色布局的颜色框。
相应地,图像和文本还将在施工过程中介绍rawimage和richtext。这样,最终的小部件结构比代码表示更深。在此场景中,如下图2所示:2:
这就是为什么当使用Dart Devtools的Flutter Inspector调试小部件树结构时,您会发现实际结构比原始代码的结构更深。
在建设性的阶段,颤音将在代码中描述的小部件转换为相应的元素树,每个小部件都有相应的元素。EATER元素代表一个类似于树的结构中特定位置的小部件实例。当前有两个基本的基本元素的类型:
它是底部和相应小部件之间的桥梁。
任何小部件都可以通过其buildContext引用元素,该元素是树上小部件的位置的上下文。类似于theme.of(context)方法中的上下文,它在构建()的参数()的参数上传递方法。
因为小部件及其上和下节点之间的关系是不可变的,所以小部件树的任何操作(例如,用文本替换文本('a')将返回一个新的widget对象集合。但是这不是意味着必须重建底层的含量。元素树在每个框架之间都是耐用的,因此它起着至关重要的性能作用。Flutter依靠此优势来实现一个机制,该机制被小部件树完全放弃并缓存底层。Flutter可以重建需要根据不断变化的小部件配置的元素树的一部分。
很少有应用仅绘制一个窗口小部件。因此,在渲染之前,有效地放电小部件并确定每个元素的大小和位置是所有UI框架的重点之一。
在渲染树中,每个节点的基类是一个布局,并绘制抽象模型的定义。这是一个普通的问题:它并不总是固定的大小,甚至不遵循规则每个人都知道其父节点的信息,但没有更多有关如何访问和获得其布局限制的信息。处理各种使用方案。
在施工阶段,扑动将为每个创建创建或更新相应的继承对象或更新其在元素树中的相应继承。在子节点的内容之前层。
以上内容在框架级别(其次是图像引擎)中介绍了Flutter的渲染过程,这只是过程框架。Flutter在Update UI上有一些差异。
在更新小部件树之前,小部件是不令人满意的,因此,即使是状态方面,每个框架都称为返回小部件树的方法,即使它是状态,也刚刚根据不同的状态返回不同的小部件树。理论将被生成和破坏,频繁的GC,但实际上,小部件只是UI的配置,对实际渲染不承担任何责任,而支出并不那么大。
更新元素树的较重元素树不会重新填充,而是根据小部件树的更改(插入,删除,更新,移动...)维护元素树。核心的几种方法包括:
1.元件调用以确定新小部件是否可以用于更新元素。
2.如果您可以更新,请致电...
更新RenderObject树...
DARTVM的内存回收机制使用了多代锁 - 无垃圾恢复,该垃圾恢复是专门为UI框架中常用的大量小部件对象而专门创建和破坏和优化的。BASIC过程:DARTVM的内存分配策略非常简单。创建对象时,您只需要在现有堆上移动指针即可。内存增长始终是线性的,消除了查找可用内存段的过程:
飞镖中类似线的概念称为分离物。每个分离株都不能与内存共享,因此此分配策略允许DART实现锁定的快速分布。Dart的垃圾回收还采用了多人算法。新一代回收时采用“半空间”算法,这会触发飞镖恢复。当前空间的所有内存:
在整个过程中,DART只需要操作少量的“活跃”对象,并且忽略了大量未引用的“死亡”对象。该算法也非常适合在扑朔迷离框架中的大量小部件重建场景。
参考:
扑朔迷离的架构概述