Flutter开发 三棵树原理

古话说:“水之积也不厚,则其负大舟也无力”,想要深入框架和语言需要打好基础,我们了解一下Flutter的核心渲染原则Flutter渲染三棵树原理

可以用网上看到的博主举的例子形容得非常恰当

Widget(产品经理),element(UI),renderObject(程序员),产品经理将我们的项目蓝图构建出来,描述给UI,UI将产品经理的想法,告诉程序员,程序员根据设计图开发程序,这就是简单的三棵树之间的关系。

一、原理介绍

Flutter中一切皆是Widget,可以通过下面一张图来熟悉一下具体的三棵树。

官网三棵树描述

官网介绍Flutter框架的的处理流程

1.根据Widget树生成一个Element树,Element树中的节点都继承自Element类。

2.根据Element树生成Render树(渲染树),渲染树中的节点都继承自RenderObject类。

3.根据渲染树生成Layer树,然后上屏显示,Layer树中的节点都继承自Layer类。

我们可以认为Flutter的UI系统包含三棵树:Widget树、Element树、渲染树。

依赖关系为:根据Widget树生成Element树,再依赖于Element树生成RenderObject 树


三棵树的具体介绍:

Widget:只是一个配置,里面存储的是有关视图渲染的配置信息,包括布局、渲染属性、事件响应信息等。是不可变的,主要负责描述UI的属性和布局,不负责实际的渲染绘制,所以创建成本很低

Element 是分离 WidgetTree 和真正的渲染对象的中间层, WidgetTree 用来描述对应的Element 属性,同时持有Widget和RenderObject,存放上下文信息,通过它来遍历视图树,支撑UI结构。

RenderObject (渲染树)用于应用界面的布局和绘制,负责真正的渲染,保存了元素的大小,布局等信息,实例化一个 RenderObject 是非常耗能的


二、三棵树创建顺序:

1)Flutter会构建Widget的Widgets树;

2)Flutter遍历Widget树,然后根据其中的Widget调用createElement()来创建相应的Element对象, 最后将这些对象组建成Element树;

3)接下来会创建第三个树,这个树中包含了与Widget对应的Element通过createRenderObject()创建 的RenderObject;


三、三棵树作用

Widget树:存放渲染内容、视图布局信息;

Element树:存放上下文,通过 Element 遍历视图树,Element 同时持有 Widget 和RenderObject;

RenderObject树:根据 Widget 的布局属性进行 layout 和绘制;

Flutter中几乎所有的对象都是Widget,而widget又分为StatelessWidgetStatefulWidget。

StatelessWidget:无中间状态的Widget,一旦创建便不可更改,只能再重新创建

StatefulWidget:存在中间状态,同时引入了State来存放中间状态,通过调用state.setState()进行更新

1、State

通常一个StatefulWidget会对应一个State,State中有两个常用的属性Widget、context

Widget:与state相绑定的Widget实例 context:StatefulWidget所对应的BuildContext。

注意:Flutter会调用mount方法,调用createRanderObject方法。同时有一个属性为mounted变量,mounted变量可以判断当前State对象是否已经被插入到树中,在进行调用state.setState()进行更新的时候需要确认mounted为true的情况。

2、BuildContext

大家对于BuildContext肯定见得比较多,不管StatelessWidget和StatefulWidget里面都有BuildContext。

并且在很多组件中都需要BuildContext,那么BuildContext具体是什么呢,BuildContext是Element的实例


四、三棵树联系

1、每一个Widget都会创建一个Element对象;

2、隐式调用createElement方法,Element加入Element树中(它会创建三种Element);

3、继承RenderObjectWidget的Widget会创建RenderElement;

RenderElement主要是创建RenderObject对象,分为两步:创建RanderElement,Flutter会调用mount方法,调用createRanderObject方法。 4、StatefulWidget会创建StatefulElement,StatefulElement继承ComponentElement;

createElement 方法中,调用createState方法,持有state。将自己(Element)和widget给state持有。

创建流程:

      a、widget调用createState方法,创建State;

      b、将Widget赋值给state;

      c、调用state的build方法 并且将自己(Element)传出去。

5、StatelessWidget会创建StatelessElement,StatelessElement继承ComponentElement;

主要就是调用build方法 并且将自己(Element)传出去。


几个知识点:

1、Element树是一个管理widget树和Rander树的上下文,build方法中context,本质就是Element。

2、Flutter的渲染是增量渲染,Element是可以被复用的;

3、widget不在widget树中就会被释放,想要不被释放,一定要持有在widget树中;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容