Flutter Widget、Element 和 RenderObject 的区别

Flutter Widget、Element 和 RenderObject 的区别

  • Widget、Element 和 RenderObject 的三者通过分工(描述、管理和渲染)和协作,实现高效、灵活的 UI 渲染和更新机制

Widget 组件

  • Widget 用于声明式地(声明式 UI)描述界面元素的外观和行为,不直接处理渲染绘制
  • Widget 都是不可变的,当 Widget 的属性改变时,需要通过重建 Widget 来反映这种变化
  • Widget 树由多个 Widget 嵌套组合形成,描述了 UI 的层级关系

Element 元素

  • Element 是 Widget 树在引擎中的实例化对象,是 UI 树的真实节点,负责管理 Widget 的生命周期和状态,并创建对应的 RenderObject,将 Widget 的配置参数(描述信息)转化为具体的渲染指令
  • Element 协调 Widget 与 RenderObject 之间的绑定关系,当 Widget 更新时,Element 会对比新旧 Widget 的差异,决定是否复用 Element,避免重复创建 Element 和 RenderObject
  • 一个 Widget 对应一个 Element,通过调用 Widget 的 createElement 方法生成对应的 Element 对象

RenderObject 渲染对象

  • RenderObject 是实际负责布局和绘制的对象,是渲染树中的节点,直接操作底层渲染引擎(比如 Skia)
  • 一个 Element 不一定对应一个 RenderObject‌,并非所有 Element 都会创建 RenderObject(比如部分 Widget 的 Element 本身不直接创建 RenderObject,而是通过其子 Widget 的 Element 来创建 RenderObject)

总结

  • 因为 Widget 不涉及渲染,所以更新代价很小,而 RenderObject 负责 UI 渲染,所以更新代价极大,于是 Element 就负责将 Widget 树的变更以最小的代价映射到 RenderObject 树上,可以通过复用 Element 来减少频繁创建和销毁 RenderObject
相关推荐
恋猫de小郭3 小时前
你还用 IDE 吗? AI 狂欢时代下 Cursor 慌了, JetBrains 等 IDE 的未来是什么?
前端·flutter·ai编程
TT_Close20 小时前
🐟 发布中心进度同步:8 个商店的上传功能开发完毕,正抓紧测试
flutter·npm·visual studio code
RaidenLiu1 天前
Flutter Platform Channel 底层架构解析 —— 从 BinaryMessenger 到跨平台消息通信机制
前端·flutter·前端框架
鹏多多1 天前
Flutter使用screenshot进行截屏和截长图以及分享保存的全流程指南
android·前端·flutter
恋猫de小郭1 天前
什么 AI 写 Android 最好用?官方做了一个基准测试排名
android·前端·flutter
勤劳打代码3 天前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
比特鹰4 天前
手把手带你用Flutter手搓人生K线
前端·javascript·flutter
火柴就是我4 天前
Flutter限制输入框只能输入中文,iOS拼音打不出来?
flutter
TT_Close4 天前
【Flutter×鸿蒙】debug 包也要签名,这点和 Android 差远了
android·flutter·harmonyos
TT_Close5 天前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos