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

Transformer模型详解(图解最完整版)

Transformer由论文提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。Transformer 与 RNN 不同,可以比较好地并行训练。

2501_91695094的博客 2699

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 286

Flutter的核心渲染模块三棵树

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

haoxuhong的博客 5064

Android各个版本存储权限适配

虽然 Android10 上面提出了外部存储分区的概念,不过之前的版本中,我们只要为应用添加了。1、AndroidManifest添加权限设置。3、拒绝权限时跳转详细设置页面。就可以像之前的方式一样访问手机的外部存储空间。2、请求所有文件管理权限。

sig321的专栏 1844

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

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

zuoluohust的博客 493

Windows本地部署Ollama+qwen本地大语言模型Web交互界面并实现公网访问

本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具,并安装Open WebUI结合cpolar内网穿透软件,实现在公网环境也能访问你在本地内网搭建的大语言模型运行环境。近些年来随着ChatGPT的兴起,大语言模型 LLM(Large Language Model)也成为了人工智能AI领域的热门话题,很多大厂也都推出了自己的大语言模型,并或多或少的开源了自己的大语言模型,今天就来分享一个最近很火,且对于小白来说比较好上手本地部署的运行本地LLM的工具Ollama。

迪之的博客 1651

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2191

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

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

weixin_39531374的博客 268

【DaVinci Developer专题】-28-Client Server Port Interface中useArgumentType、useArrayBaseType和useVoid介绍

共7页 目录 1 ImplPolicy = useArgumentType 2 ImplPolicy = useArrayBaseType 3 ImplPolicy = useVoid 4 三者代码差异部分 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer

「汽车电子助手」的博客 1502

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

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

weixin_35756373的博客 104

《AgentScope-Java 深入浅出教程》第2章 环境搭建与第一个智能体

创建// 【导入说明】/*** 时间相关工具类* 工具类是普通的 Java 类,通过注解声明为工具。* 智能体可以根据用户需求自动调用这些工具。*/// 【工具定义】获取当前时间@Tool(name = "get_current_time", // 工具名称:LLM 看到的名称description = "获取指定时区的当前时间" // 工具描述:帮助 LLM 理解何时使用// 【参数定义】// @ToolParam 的 name 属性是必需的!

步子哥的博客 417

RK3568笔记五十四:SORT实时目标追踪

YOLOv5具备目标检测的功能,把视频分解成多幅图像并逐帧执行时,如果视频帧中有多个目标,如何知道一帧中的目标和上一帧是同一个对象就是目标跟踪的工作。DeepSort是实现目标跟踪的算法,从sort(simple online and realtime tracking)演变而来,使用卡尔曼滤波器预测所检测对象的运动轨迹,匈牙利算法将它们与新的检测目标相匹配。结合YOLOv5和DeepSORT可以在实时场景中实现高效的目标检测和跟踪。

788

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

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

YoYo_Newbie的专栏 1623

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Flutter的UI渲染小记

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

郭霖 1341

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入浅出 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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值