当前位置: 首页 > backend >正文

【Flutter】Widget、Element和Render的关系-Flutter三棵树

【Flutter】Widget、Element和Render的关系-Flutter三棵树

一、前言

在 Flutter 中,所谓的“三棵树”是指:

  • Widget Tree(部件树)
  • Element Tree(元素树)
  • Render Tree(渲染树)

它们是 Flutter 框架内部 UI 构建与渲染机制中的核心概念,三者相互协作,共同支撑起高性能的界面渲染。

By the way,博主在面试的时候被问了「三棵树是什么?」,我一时不知道说的是啥,但是我知道他们的联系,之前一直从事原生开发,第一次面试Flutter( ̄. ̄)( ̄∇ ̄)ㄟ(▔,▔)ㄏ。


二、三棵树是什么

1、Widget Tree(部件树)

  • 是什么?
    Widget 是 Flutter 中的 UI 声明式组件,比如 TextContainerRowColumn 等。

  • 特点:

    • 不可变的(immutable)
    • 描述 UI 的静态结构
    • 每次 build() 都会重新创建新的 Widget 树
  • 作用:
    用于描述你想“画”什么,但本身不具备渲染能力。


2、Element Tree(元素树)

  • 是什么?
    每个 Widget 被插入树中后,都会生成对应的 Element(元素),用于维护 widget 的上下文(state、位置等)。

  • 特点:

    • 是 widget 的“实例化”版本
    • 可变对象,框架会尽量重用元素以优化性能
    • 包含对 widget 的引用以及对渲染对象(RenderObject)的引用(若有)
  • 作用:

    • 连接 widget(声明)和 render object(绘制)之间的桥梁

3、Render Tree(渲染树)

  • 是什么?
    真正承担绘制任务的对象树,所有具有可视化能力的 Widget(如 ContainerText)最终会转化为 RenderObject 并构建成渲染树。

  • 特点:

    • 控制尺寸、布局、绘制、命中测试等底层功能
    • 位于 Flutter 的渲染层(flutter/rendering
    • 通常由 RenderBox 及其子类构成
  • 作用:

    • 负责计算布局、绘制 UI 到屏幕

4、三棵树的联系

  1. 你编写的 Flutter 界面,首先构建出一棵 Widget 树
  2. Flutter 框架根据 Widget 树构造或更新对应的 Element 树
  3. 如果 Widget 是有可视化效果的,它还会创建相应的 RenderObject,并组成 Render Tree
  4. Render Tree 最终执行布局和绘制,渲染出用户看到的界面

5、举例说明

Widget build(BuildContext context) {return Column(children: [Text("Hello"),Container(padding: EdgeInsets.all(8),child: Text("World"),),],);
}
  • Widget Tree:构建出 Text、Container、Text 等节点
  • Element Tree:每个 Widget 会创建一个对应的 Element(StatelessElement / StatefulElement)
  • Render Tree:Text → RenderParagraph,Container → RenderDecoratedBox,控制真实布局和绘制

三、总结对比

树类型是否可变作用生命周期
Widget Tree不可变描述 UI 结构每次 build 重建
Element Tree可变管理 widget 实例上下文尽量复用
Render Tree可变控制布局与绘制可复用/更新

在这里插入图片描述

四、关于作者(ZFJ_张福杰)

  • 官网:https://zfjsafe.com
  • 博客:https://zfj1128.blog.csdn.net
  • Github:https://github.com/zfjsyqk
  • Gitee:https://gitee.com/zfj1128
  • 打赏:https://zfjsafe.com/paycode
http://www.xdnf.cn/news/14219.html

相关文章:

  • 写出优秀的 Git 提交信息:一份详尽指南(Angular 风格)
  • CS144 lab0: warmup
  • 嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应
  • Flutter动画与交互:打造流畅用户体验的完整指南
  • 基于GNU Radio Companion搭建的AM信号实验
  • 项目拓展-Apache对象池,对象池思想结合ThreadLocal复用日志对象
  • 前端面试专栏-主流框架:7. React核心概念(组件、JSX、状态管理)
  • JAVA-了解网络编程
  • QNAP威联通NAS配置SFTP与内网穿透技术实现远程文件访问
  • Docker 部署 RomM 指南:打造私有戏库与即点即玩系统
  • 31-Oracle 23 ai-Unrestrict Parallel DML(无限制并行DML)
  • 支付宝转账怎么测试?
  • 《B4A安卓开发实战秘籍》
  • logger2js - JavaScript日志与调试工具库
  • 静态库和共享库(动态库)的编译链接
  • Abaqus控制网格的方法
  • 测试开发-正交法
  • CRASIM输入输出变量中英文对照
  • 如何打造沉浸式文件操作体验
  • linux用反汇编分析访问空指针问题
  • Springboot短视频推荐系统b9wc1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • legged_control足式机器人控制框架及代码解析(三):legged_interface NMPC接口
  • ReentrantLock的lockInterruptibly有什么用
  • 【二叉树】(四)二叉搜索树的基础修改构造及属性求解1
  • Java 小工具 - 节假日判断(包含周末),并提供离线版和在线版
  • 《单光子成像》第三章 预习2025.6.13
  • java集合篇(五) ---- List接口
  • 【技术追踪】用于 CBCT 到 CT 合成的纹理保持扩散模型(MIA-2025)
  • 3GPP协议PDF下载
  • Wireshark安装