Flutter 了解 Element

Flutter初探 - Element简要分析 Flutter源码初探 - Element简要分析 前面我们分析了Widget,发现源码非常简单,主要逻辑就是构建子树,以及是创建Element。 那Element有何神奇?且看Element。 首先我们看下Element家族的继承关系: 我们可以看到Element系列庞大,但跟我们平常开发关系比较大却不多。接下来我们会主要围绕这个继承关系图,逐个分析主要的类。 DiagnosticableTr... 阅读详情

一 Element 概念

这个玩意的概念。到底是什么 ?

官方解释是在树中特定位置的实例。

二 继承关系

element 有 ComponentElement 和 RenderObjectElement  之分

1 ComponentElement

class StatelessElement extends ComponentElement

class StatefulElement extends ComponentElement

三  生命周期

1 framework 通过在将要被用来作为Element的初始配置的widget 上调用其createElement 方法来创建一个element

2 framework 通过调用mount 方法 将一个新创建的element 加入树中给定的父节点的插槽下面。

mount 方法负责注入任何child widgets,并且会在有需要·的时候,会调用attachRenderObject 

将关联的render objects  添加到渲染树中 render tree 中。到这一步的时候,element 会进入active 状态,并且会显示在屏幕上方。

四 方法分析

Element 这个抽象类中有一个方法 叫做 mount 方法 。

  /// Add this element to the tree in the given slot of the given parent.
  ///
  /// The framework calls this function when a newly created element is added to
  /// the tree for the first time. Use this method to initialize state that
  /// depends on having a parent. State that is independent of the parent can
  /// more easily be initialized in the constructor.
  ///
  /// This method transitions the element from the "initial" lifecycle state to
  /// the "active" lifecycle state.
  ///
  /// Subclasses that override this method are likely to want to also override
  /// [update], [visitChildren], [RenderObjectElement.insertRenderObjectChild],
  /// [RenderObjectElement.moveRenderObjectChild], and
  /// [RenderObjectElement.removeRenderObjectChild].
  ///
  /// Implementations of this method should start with a call to the inherited
  /// method, as in `super.mount(parent, newSlot)`.
  @mustCallSuper
  void mount(Element? parent, Object? newSlot) {
    assert(_lifecycleState == _ElementLifecycle.initial);
    assert(widget != null);
    assert(_parent == null);
    assert(
        parent == null || parent._lifecycleState == _ElementLifecycle.active);
    assert(slot == null);
    _parent = parent;
    _slot = newSlot;
    _lifecycleState = _ElementLifecycle.active;
    _depth = _parent != null ? _parent!.depth + 1 : 1;
    if (parent != null) {
      // Only assign ownership if the parent is non-null. If parent is null
      // (the root node), the owner should have already been assigned.
      // See RootRenderObjectElement.assignOwner().
      _owner = parent.owner;
    }
    assert(owner != null);
    final Key? key = widget.key;
    if (key is GlobalKey) {
      owner!._registerGlobalKey(key, this);
    }
    _updateInheritance();
    attachNotificationTree();
  }

renderObjectElement 的mount 方法

其主要作用 将element相关联的renderObject插入到渲染树中,插入到渲染树后的element就处于“active”状态,处于“active”状态后就可以显示在屏幕上了。

此处可以看出来,RenderObject? _renderObject;  element 是持有renderObject 的引用的

  @override
  void mount(Element? parent, Object? newSlot) {
    super.mount(parent, newSlot);
    assert(() {
      _debugDoingBuild = true;
      return true;
    }());
    _renderObject = (widget as RenderObjectWidget).createRenderObject(this);
    assert(!_renderObject!.debugDisposed!);
    assert(() {
      _debugDoingBuild = false;
      return true;
    }());
    assert(() {
      _debugUpdateRenderObjectOwner();
      return true;
    }());
    assert(_slot == newSlot);
    attachRenderObject(newSlot);
    _dirty = false;
  }

Flutter快学快用24讲--22 自渲染模式:从 Flutter 的渲染原理,进一步掌握性能优化策略 本课时着重介绍了 Flutter 自渲染中的三棵树知识,从 Flutter 的三棵树概念到三棵树对应关系,其中着重介绍了三棵树的转化流程,并在流程中总结出性能优化需要着重注意的点。学完本课时后,你需要掌握 Flutter 的三棵树概念,并非常清晰的了解三棵树的转化过程,通过对转化过程中性能优化知识的学习,从而在编码过程中养成一个非常好的编码习惯。点击链接,查看本课时源码。 阅读详情

相关推荐

Flutter核心原理(2):Element与BuildContext

其实,Element与BuildContext之间的关系我们是可以通过源码分析的。 Element: 最终的UI树其实是由一个个独立的Element节点构成。组件最终的Layout、渲染都是通过RenderObject来完成的。 从创建到渲染的大体流程是: 根据Widget生成Element,然后创建相应的RenderObject并关联到Element.renderObject属性上,最...

手写我对你的温柔 2188

Flutter渲染机制(二):Element

在Flutter渲染机制(一):Widget 树一文中,我们介绍了 Widget 树,发现每一种类型的 Widget 都会创建与之相对应的 Element,那这个 Element 又是什么,有什么作用呢?Element 是 Widget 的实际内容,并且会根据 Widget 的位置,配置自己在书中的位置。Element 会形成一棵树,有的 Element 有一个子节点,有的有多个子节点。

Elson的博客 786

【Flutter核心类分析】深入理解Element

文章目录背景Element分类核心源码分析Element.updateChildElement.inflateWidgetElement.upateStatelessElement.updateStatefulElement.updateProxyElement.updateRenderObjectElement.updateSingleChildRenderObjectElement.updateMultiChildRenderObjectElement.updateElement.mountCompon

人生百年几今日,今日不为真可惜。 7253

Flutter框架分析(三)-Element

1. 前言 上一篇文章讲到,Widget是描述一个UI元素的配置数据,Element才真正代表屏幕显示元素,是某个位置的Widget生成的实例。本篇文章则主要介绍Element的主要功能。 通过上篇文章介绍的Widget Tree,Flutter Framework会生成一系列Element,这些Element构成了Element Tree,其主要功能如下: 维护这棵Element Tree,根据Widget Tree的变化来更新Element Tree,包括:节点的插入、更新、删除、移动等; 将Widg

zuoluohust的博客 526

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2919

3D IC中Memory-on-Logic堆叠测试的DFT解决方案与工程实践

在半导体行业,随着摩尔定律逼近物理极限,3D IC技术通过芯片垂直堆叠实现性能提升和异构集成,已成为重要发展方向。其核心原理是利用硅通孔(TSV)或微凸块实现芯片间电气互连,将多个不同功能的芯片(如逻辑芯片与存储芯片)集成在一个封装内。这项技术的核心价值在于能大幅提升系统性能、降低功耗并实现更小的封装尺寸。然而,芯片堆叠后,传统的测试方法面临巨大挑战,尤其是测试访问存在物理屏障,无法直接探测被覆盖的芯片接口。为此,可测试性设计(DFT)成为确保3D IC可靠性与量产可行性的关键技术。它通过在设计阶段植入专用

weixin_42521058的博客 631

Flutter的核心渲染模块三棵树

​​​​​​​ Flutter 中有三棵树:Widget 树,Element 树和 RenderObject 树。当应用启动时 Flutter 会遍历并创建所有的 Widget 形成 Widget Tree,同时与 Widget Tree 相对应,通过调用 Widget 上的 createElement() 方法创建每个 Element 对象,形成 Element Tree。最后调用 Element 的 createRenderObject() 方法创建每个渲染对象,形成一个 Render Tree。 E

haoxuhong的博客 5064

Windows 24H2升级后eNSP AR_40报错40?VirtualBox虚拟化修复指南

虚拟化技术通过Hypervisor在操作系统与硬件间建立抽象层,使虚拟机能够共享物理资源。其核心原理依赖CPU的VT-x/AMD-V指令集,而Windows 24H2对内核隔离与驱动签名的强化会直接占用或拦截这些虚拟化资源。在工程实践中,VirtualBox作为Type-2型Hypervisor,常因内存完整性开启或版本过旧导致虚拟网卡创建失败,进而引发设备启动中断。典型场景包括网络仿真实验、多系统测试环境搭建等。当eNSP的AR_40路由器依赖VirtualBox引擎时,24H2的安全策略变更便会触发错误

weixin_34375251的博客 214

Flutter框架分析(五)-Widget,Element,RenderObject树

1. 前言 在本系列文章的前面三篇文章中,已经分别介绍Flutter的三种核心元素:Widget,Element,和RenderObject。并介绍了它们之间的关系。在这篇文章中,将在前面文章的基础上,对Flutter中非常出名的概念“Widget,Element,RenderObject树”进行剖析,以此加深读者对Flutter Framework的理解。 2. Widget,Element,RenderObject树的概念和作用 学习Flutter的时候经常会遇到一个概念:Widget,Element,

zuoluohust的博客 493

PICO SCOPE 二次开发

基于C#开发一个简单的PICO示波器的上位机工作,与MCC600运动控制卡一起,实现数据自动采集

nixoncheng的博客 1147

别再瞎试了!手把手教你用DC NXT的compile_ultra命令搞定物理综合(附完整脚本)

本文详细介绍了如何使用DC NXT的compile_ultra命令进行物理综合,包括环境配置、设计库创建、RTL加载、物理约束加载等关键步骤。通过实战示例和完整脚本,帮助工程师快速掌握TOPO模式下的物理综合流程,提升设计效率。

weixin_30413765的博客 294

element做树形下拉_从源码了解Flutter的渲染基础:Widget/Element/RenderObject

如果你要使用Flutter开始构建一个页面,那么你可能从Widget开始一层一层搭建。但是你曾经想过这些Widget是如何绘制到屏幕上的吗?很多同学应该会熟悉Flutter的三个树形结构:Widget TreeElement TreeRenderObject Tree站在Flutter程序员的角度,打交道最多的应该是Widget了,那么下面我带领大家从Flutter源码读起来看一下一个Widget...

weixin_39531374的博客 268

【SLAM论文笔记】SplaTAM论文小结

参考方法有ORB-SLAM3、Point-SLAM、NICE-SLAM、Kintinuous、ElasticFusion,测试数据集有ScanNet++、Replica、TUM-RGBD、Orig-ScanNet,SpaTAM并未在全部对比均为第一,表现最佳的是在ScanNet++、Replica,ScanNet++上SplaTAM方法位姿精度比第2名ORB-SLAM3高两个数量级,在TUM。上无稀疏SLAM结果,NICE-SLAM与Point-SLAM占优。SplaTAM基本做到了SOTA。

持之以恒 1008

element 不渲染_从源码了解Flutter的渲染基础:Widget/Element/RenderObject

如果你要使用Flutter开始构建一个页面,那么你可能从Widget开始一层一层搭建。但是你曾经想过这些Widget是如何绘制到屏幕上的吗?很多同学应该会熟悉Flutter的三个树形结构:Widget TreeElement TreeRenderObject Tree站在Flutter程序员的角度,打交道最多的应该是Widget了,那么下面我带领大家从Flutter源码读起来看一下一个Widget...

weixin_35756373的博客 104

图解转置卷积原理

声明:本文大部分搬运自【机器学习】详解 转置卷积 (Transpose Convolution) 感谢博主花与人间事同,本人只是在博主原创文章上做补充以及添加一些自己的理解。 1 转置卷积的背景 通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,称为上采样 (Upsample),如下图所示: 上采样方法有很多,详见【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值

laonafahaodange的博客 5684

《八》:玩家位置同步(玩家防碰撞)

在VR大空间体验中,由于玩家佩戴头显设备无法直接观察彼此位置,容易发生碰撞。因此,需要将玩家的实时位置信息绘制在虚拟空间中,实现位置可视化。通过获取头显的位置和旋转角度等数据,可以推算出玩家的移动状态和位置。使用可序列化的玩家结构体,通过UDP将玩家数据发送到服务器,服务器接收并反序列化数据后,同步所有玩家的最新信息至各客户端。客户端根据接收到的数据渲染虚拟人物模型,实现动态位置更新。这一过程涉及数据序列化、反序列化、网络通信和实时渲染等技术,确保玩家在虚拟空间中的位置同步和可视化。

unitygroup的博客 412

20分钟源码角度彻底了解Flutter的State生命周期以及Widget, Element, RenderObject的关系(超详细)

这个文章将会让你了解flutter的三棵树,并且知道Widget的生命周期是怎么被执行的,从而写代码和修Bug会有很大的帮助

YoYo_Newbie的专栏 1623

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Flutter的UI渲染小记

/ 今日科技快讯 /近日,华为在开发者大会发布了鸿蒙OS 2.0系统,并对生态进行了完整链条的赋能。据报道,华为消费者BG软件开发副总裁杨海松在受访时表示,华为的小目标是,一年内...

郭霖 1338

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深入浅出 Flutter Framework 之 BuildOwner

Overview BuildOwner在 Element 状态管理上起到重要作用: 在 UI 更新过程中跟踪、管理需要 rebuild 的 Element (「dirty elements」); 在有「dirty elements」时,及时通知引擎,以便在下一帧安排上对「dirty elements」的 rebuild,从而去刷新 UI; 管理处于 "inactive" 状态的 Element。 这是我们遇到的第一个 Owner,后面还有PipeOwner。 整棵「Element Tree」共

s297165331的专栏 358

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Flutter UI架构(3)

Flutter使用dart语言来构建维护UI数据,然后通过Impeller渲染引擎来进行UI渲染,在学习源码之前,我们先来了解一下Flutter的UI框架的大体架构,这样后面再学习源码可以事半功倍。

起司锅仔的博客 1174

Flutter 「更新树」涉及到的问题

上篇文章中,我们知道了 Flutter 的视图树中有三种树 Widget Element RenderObject 而且,Flutter 建议,Widget 最好是 不可变的(immutable)。 问题一 但是为什么呢?如果我们的页面数据发生变化,那么视图也需要发生变化,怎么办呢? flutter 界面开发是一种响应式编程,主张 simle is fast flutter 设...

JerryWu145的专栏 710

Flutter完整开发实战详解(六、 深入Widget原理)

作为系列文章的第六篇,本篇主要在前文的探索下,针对描述一下 Widget 中的一些有意思的原理。 前文: 一、Dart语言和Flutter基础 二、 快速开发实战篇 三、 打包与填坑篇 四、Redux、主题、国际化) 五、 深入探索 首先我们需要明白,Widget 是什么?这里有一个“总所周知”的答就是:Widget并不真正的渲染对象。是的,事实上在 Flutter 中渲染...

粉丝交流群:957013433 257

赋值后页面不渲染_深入理解 Flutter Widget 体系架构与 UI 渲染流程

本篇为 Flutter 技术原理基础篇章,了解了底层原理后,可以更好的展开诸如状态管理、Navigator 页面导航、Key 的设计原理、FPS 等技术领域,我们从开发中最常接触到的 Widget 入手,解析 Flutter Widget 体系结构和 UI 渲染流程。阅读本文大概需要 2 分钟(认真脸)。考虑几个问题1.setState 是如何更新 UI 的?2.Widget、Eleme...

weixin_32417571的博客 584

flutter 专题四十六 Flutter渲染之Widget、Element、RenderObject

其中,布局和绘制在 RenderObject 中完成,Flutter 采用深度优先机制遍历渲染对象树,确定树中各个对象的位置和尺寸,并把它们绘制在不同的图层上。总的来说,Flutter提出一切皆Widget,Widget 主要用来保存 Element 信息,而Element作用Widget 的实例,存放视图构建的上下文数据,并且同时持有Widget和RenderObject对象,RenderObject的主要作用是处理布局、绘制相关的事情,确定Element树中每个对象的位置和尺寸。

m0_61164038的博客 1135

Flutter Widget和Element

文章目录1 Widget2 Element 1 Widget /// Describes the configuration for an [Element]. /// 为Element提供配置信息 /// /// Widgets are the central class hierarchy in the Flutter framework. A widget /// is an immuta...

hongxue8888的博客 698

Flutter渲染之Widget、Element 和 RenderObject

提出问题 用Flutter写界面写了一段时间了,感觉很爽,尤其是热加载功能,节省了大把时间,声明式的编程方式也是以后的趋势。现在基本熟练以后一些简单的效果能很快写出来,即使没见过的也可以在网上搜一下找到答案,但是感觉没有深入底层了解,有些问题还是一知半解,这些问题比如以下几个: createState 方法在什么时候调用?state 里面为啥可以直接获取到 widget 对象? build 方法是在什么时候调用的? BuildContext 是什么? Widget 频繁更改创建是否会影响性能?复用

大灰狼的小绵羊哥哥的博客 1955
上一篇: Flutter渲染原理
下一篇: Flutter 中的key
Leonardo_Fibonacci
博客等级 码龄10年 110粉丝 247原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值