Flutter的一些概念(二)
注:本文同步发布于微信公众号:stringwu的互联网杂谈 Flutter的一些概念(二)
1 flutter的核心渲染模块
当应用启动时flutter 会遍历所有的Widget 形成Widget 树,并通过createElement 方法创建每个element 对象,最后通过createRenderObject 方法创建renderobject 对象
1.1 Widget
Widget 树作来描述UI结构,很轻量,
1.2 Element
Element同时持有Widget和RenderObject
会存放一些上下文信息,,支撑UI 结构
1.3 RenderObject
Render 控制实际的布局和绘制,保存元素的大小和布局等信息,实例化一个RenderObject 是非常耗时的。
2 Layer 和SceneBuilder的区别与联系
在Flutter中,SceneBuilder和Layer都是渲染流程中的关键概念,是紧密相关的,它们一起工作来构建应用程序的UI。当用户操作应用程序时,SceneBuilder会根据用户输入来更新Scene,并生成新的Layer。然后,Flutter将这些Layer传递给GPU或CPU进行渲染,从而生成最终的UI
Layer 和 SceneBuilder 都是渲染流程中的关键概念,它们是构建和渲染 UI 的一部分;
2.1 Layer
Layer 树是渲染树的一部分,但它与 Widget 树不同,因为 Layer 树是专门用于渲染的。 Layer 是一个抽象类,代表了屏幕上的一块区域。在 Flutter 的渲染流程中,Widget 首先被转换成 Element,然后 Element 被转换成 RenderObject,最终 RenderObject 被转换成 Layer。
Flutter 中有几种不同类型的 Layer,包括但不限于:
- ContainerLayer:一个简单的层,没有任何视觉内容,但可以包含其他层。
- PictureLayer:包含 Skia 图形引擎的 Picture 对象,用于绘制图形。
- OpacityLayer:可以设置子层的透明度。
- TransformLayer:可以对子层进行变换操作,如旋转、缩放、平移等。
- ClipRectLayer、ClipRRectLayer 和 ClipPathLayer:用于裁剪子层,只显示特定形状内的区域。
2.2 SceneBuilder
SceneBuilder 是一个在构建阶段用来构建 Scene 对象的工具类。Scene 对象代表了整个 Flutter应用的渲染树,包括所有的Layer。SceneBuilder 提供了一系列方法来添加、修改和删除Layer,构建最终的渲染输出。SceneBuilder 的使用通常涉及以下步骤:
- 创建
SceneBuilder实例:开始构建过程。 - 添加
Layer:使用addRect、addPicture、addTexture等方法添加不同类型的 Layer。 - 构建
Scene:通过调用 build 方法完成 Scene 的构建。 - 提交渲染:将构建好的 Scene 提交给渲染引擎进行渲染。
首先由 UI 线程构建 Widget 树,然后通过 Renderer 将 Widget 树转换成 RenderObject 树,接着 RenderObject 树被转换成 Layer 树。最后,使用 SceneBuilder 构建 Scene,并提交给渲染引擎进行渲染。
3 几个关键字之间的联系
mixin implements extends这三个关键字在Dart中可同时存在,其中
mixin 混入,多个类层次结构中复用类代码的方法,使用mixin的条件
- mixins类只能继承自object
- mixins 不能有构造函数
- implements 实现接口
- extends 继承
4 widget的分类
- 绘制类:
RenderObjectWidget,相关的方法调用顺序为:layout -> performResize -> performLayout -> markNeedsPaint - 代理类,
inheritedWidget和ParentDataWidget,一般用 于状态的共享 - 组合类:
StatelesWidget和StatefulWidget
5 参考
公众号二维码,有兴趣的小伙伴可以关注一下

Flutter的一些概念(二)的更多相关文章
- JavaScript基本概念(二)
JavaScript 基本概念(二) 操作符和语句 目录 操作符 一元操作符 位操作符 布尔操作符 乘性操作符 其他操作符 语句部分 说起操作符,回忆下上一篇文章末尾说的话. 操作符 一元操作符 ++ ...
- C#学习基础概念二十五问
C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...
- Flutter学习笔记(二)
*.assets 当引用图片的时候,需要在pubspec.yaml的文件中的flutter下添加assets,类似于下面的样子: image.png 这里需要注意的是文件里的assets只要一个缩进即 ...
- 一、动态网络编程的概念 二、Tomcat服务器搭建 三、Servlet组件介绍
一.动态网络编程的概念 动态网页:结合了HTML以外的高级程序编程语言和数据库技术生成的页面. 动态网页编程技术: ASP,PHP,JSP HTTP协议:规范浏览器和服务器之间通信的数据格式. 浏览器 ...
- C#基础概念二十五问
1.静态成员和非静态成员的区别? 答: 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过 ...
- Flutter扫码识别二维码内容
前面一篇写了生成二维码图片,这篇来写使用相机扫描识别二维码 识别二维码需要用到插件 barcode_scan 首先在 pubspec.yaml 文件中添加以下依赖,添加依赖后在 pubspec.yam ...
- disruptor 核心概念 二
一.Disruptor图解 二.disruptor核心概念 1.RingBuffer到底是啥?正如名字所说的一样,他是一个环(首尾相接的环)它用做在不同上下文(线程)间传递数据的buffer Ring ...
- Flutter入门教程(二)开发环境搭建
学习Flutter,首先需要搭建好Flutter的开发环境,下面我将一步步带领大家搭建开发环境并且成功运行flutter项目. Flutter环境配置主要有这几点: 系统配置要求 Java环境 Flu ...
- 理解 Flutter 的基础概念:Widget
Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...
- IoC容器Autofac之IOC/DI基本概念(二)
原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...
随机推荐
- DRF-Throttle组件源码分析及改编源码
1. 限流组件源码分析 注意:以下源码为方便理解已进行简化,只保留了与限流组件相关的代码.注释前的数字代表执行顺序. SimpleRateThrottle类的源码解析: 2. 实践:编写一个限流类 f ...
- git安装-Tortoise git 安装汉化教程
1.首先下载 去官网下载 如果下载比较慢的,链接自取 https://pan.quark.cn/s/fcb9d0b39c7f 2. 安装git 3. 安装git图形化工具Tortoise git 4. ...
- js 数字计算的精度问题
〇.js 的数值计算存在结果不精确的情况 最近接触财务相关系统,页面上会有一些简单的计算,就发现其实是非常简单的计算,但 js 计算出来的结果却不是预期值,可能带上一大串 0 或 9,导致计算结果错误 ...
- Ubuntu 重启后 wifi 图标不见了 连不上网
今天重启了一下电脑,结果wifi图标不见了,打开浏览器,无法联网.想了办法用网线先连上网,去网上找了找,说让我执行 sudo service network-manager restart 但是我执行 ...
- Windows 自动色彩管理(ACM)
在一些笔记本上Win11可以看到设置里有"自动管理应用的颜色"选项,有些笔记上没有.这里讲下"自动管理应用的颜色"的显示规则 看华为MetaBook E设置界面 ...
- APISIX配置
APISIX yum install -y apisix-2.12.1-0.el7.x86_64.rpm yum install -y cyrus-sasl-devel-2.1.26-23.el7.x ...
- 读书笔记-C#8.0本质论-07
19. 平台互相操作性和不安全代码 19.1 在托管平台调用非托管代码--P/Invoke模式 CLI通过P/Invoke功能对非托管DLL所导出的函数执行API调用.和类的所有普通方法一样,必须在类 ...
- 项目部署工具之walle
最近部署walle进行线上项目的上线发布,安装中遇到的问题,在此记录 walle(http://www.walle-web.io) git地址:https://github.com/meolu/wal ...
- 网站安全锁-SSL证书
为了安全起见,现在开发微信服务号和IOS客户端等访问服务器端都要求使用https加密传输. SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证 ...
- 2016GPLT
排座位 从1到N编号:M为已知两两宾客之间的关系数:K为查询的条数.随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头.注意两个人不可能既是朋 ...