一、Widget(描述层)
本质
👉不可变的 UI 配置(immutable configuration)
Widget 只负责描述:
UI 长什么样
它不负责状态管理(除非配合 State)也不负责渲染
特点
- 非常轻量,可以频繁创建
- 每次 rebuild 都会生成新的 Widget
- 类似“配置对象”
示例
Text("Hello") Container(color: Colors.red)二、Element(中间层)
本质
👉Widget 的实例 + 生命周期管理者
它是 Flutter 的核心调度层,负责:
- 维护树结构(Element Tree)
- 保存状态(StatefulWidget 的 State)
- 做 diff(新旧 Widget 对比)
- 决定是否需要更新 UI
- 连接 Widget 和 RenderObject
关键理解
👉 Widget 是“配置”
👉 Element 是“运行中的实例”
特点
- 生命周期比 Widget 长
- 不会频繁销毁
- 控制性能优化(避免不必要重建)
三、RenderObject(渲染层)
本质
👉真正执行渲染的对象
负责三件核心事情:
- layout(布局计算)
- paint(绘制)
- hitTest(事件命中检测)
常见类
RenderBoxRenderFlexRenderParagraph
特点
- 操作的是像素级别
- 性能极高但复杂
- 一般开发不会直接接触
四、三者关系(核心链路)
完整流程如下:
Widget(描述 UI)
↓
Element(管理 / diff / 生命周期)
↓
RenderObject(布局 + 绘制)
一句话总结:
👉 Widget:描述要做什么
👉 Element:决定要不要更新
👉 RenderObject:负责怎么画出来
五、setState 时发生了什么?
setState(() {})
底层流程:
- 创建新的 Widget
- Element 拿“新旧 Widget”做 diff
- 判断:
- 是否复用当前 Element
- 是否需要更新 RenderObject
- 只更新变化的部分(性能关键)
六、三层对比表
| 层级 | 是否可变 | 作用 |
|---|---|---|
| Widget | ❌ 不可变 | 描述 UI |
| Element | ✅ 可变 | 管理结构 + 控制更新 |
| RenderObject | ✅ 可变 | 布局 + 绘制 |
七、一个直观比喻
- Widget = 设计图
- Element = 工程管理者
- RenderObject = 施工工人
八、实际开发建议
大多数情况下你只需要:
- 写 Widget
- 用
setState/ Provider / Bloc / GetX 控制更新
👉不要直接操作 RenderObject(除非做底层框架或自定义布局)
九、什么时候需要接触 RenderObject?
只有这些场景:
- 自定义布局(比如实现自己的 Row/Column)
- 高性能绘制(Canvas)
- 写 Flutter 底层组件