注:本文同步发布于微信公众号:stringwu的互联网杂谈 Flutter的一些概念(二)

1 flutter的核心渲染模块

当应用启动时flutter 会遍历所有的Widget 形成Widget 树,并通过createElement 方法创建每个element 对象,最后通过createRenderObject 方法创建renderobject 对象

1.1 Widget

Widget 树作来描述UI结构,很轻量,

1.2 Element

Element同时持有WidgetRenderObject

会存放一些上下文信息,,支撑UI 结构

1.3 RenderObject

Render 控制实际的布局和绘制,保存元素的大小和布局等信息,实例化一个RenderObject 是非常耗时的。

2 Layer 和SceneBuilder的区别与联系

Flutter中,SceneBuilderLayer都是渲染流程中的关键概念,是紧密相关的,它们一起工作来构建应用程序的UI。当用户操作应用程序时,SceneBuilder会根据用户输入来更新Scene,并生成新的Layer。然后,Flutter将这些Layer传递给GPU或CPU进行渲染,从而生成最终的UI

LayerSceneBuilder 都是渲染流程中的关键概念,它们是构建和渲染 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应用的渲染树,包括所有的LayerSceneBuilder 提供了一系列方法来添加、修改和删除Layer,构建最终的渲染输出。SceneBuilder 的使用通常涉及以下步骤:

  • 创建SceneBuilder 实例:开始构建过程。
  • 添加 Layer:使用 addRectaddPictureaddTexture 等方法添加不同类型的 Layer。
  • 构建Scene:通过调用 build 方法完成 Scene 的构建。
  • 提交渲染:将构建好的 Scene 提交给渲染引擎进行渲染。

首先由 UI 线程构建 Widget 树,然后通过 RendererWidget 树转换成 RenderObject 树,接着 RenderObject 树被转换成 Layer 树。最后,使用 SceneBuilder 构建 Scene,并提交给渲染引擎进行渲染。

3 几个关键字之间的联系

mixin implements extends这三个关键字在Dart中可同时存在,其中

mixin 混入,多个类层次结构中复用类代码的方法,使用mixin的条件

  • mixins类只能继承自object
  • mixins 不能有构造函数
  • implements 实现接口
  • extends 继承

4 widget的分类

  • 绘制类:RenderObjectWidget ,相关的方法调用顺序为:layout -> performResize -> performLayout -> markNeedsPaint
  • 代理类,inheritedWidgetParentDataWidget,一般用 于状态的共享
  • 组合类:StatelesWidgetStatefulWidget

5 参考

Flutter面试题

公众号二维码,有兴趣的小伙伴可以关注一下

Flutter的一些概念(二)的更多相关文章

  1. JavaScript基本概念(二)

    JavaScript 基本概念(二) 操作符和语句 目录 操作符 一元操作符 位操作符 布尔操作符 乘性操作符 其他操作符 语句部分 说起操作符,回忆下上一篇文章末尾说的话. 操作符 一元操作符 ++ ...

  2. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

  3. Flutter学习笔记(二)

    *.assets 当引用图片的时候,需要在pubspec.yaml的文件中的flutter下添加assets,类似于下面的样子: image.png 这里需要注意的是文件里的assets只要一个缩进即 ...

  4. 一、动态网络编程的概念 二、Tomcat服务器搭建 三、Servlet组件介绍

    一.动态网络编程的概念 动态网页:结合了HTML以外的高级程序编程语言和数据库技术生成的页面. 动态网页编程技术: ASP,PHP,JSP HTTP协议:规范浏览器和服务器之间通信的数据格式. 浏览器 ...

  5. C#基础概念二十五问

    1.静态成员和非静态成员的区别? 答: 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过 ...

  6. Flutter扫码识别二维码内容

    前面一篇写了生成二维码图片,这篇来写使用相机扫描识别二维码 识别二维码需要用到插件 barcode_scan 首先在 pubspec.yaml 文件中添加以下依赖,添加依赖后在 pubspec.yam ...

  7. disruptor 核心概念 二

    一.Disruptor图解 二.disruptor核心概念 1.RingBuffer到底是啥?正如名字所说的一样,他是一个环(首尾相接的环)它用做在不同上下文(线程)间传递数据的buffer Ring ...

  8. Flutter入门教程(二)开发环境搭建

    学习Flutter,首先需要搭建好Flutter的开发环境,下面我将一步步带领大家搭建开发环境并且成功运行flutter项目. Flutter环境配置主要有这几点: 系统配置要求 Java环境 Flu ...

  9. 理解 Flutter 的基础概念:Widget

    Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...

  10. IoC容器Autofac之IOC/DI基本概念(二)

    原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...

随机推荐

  1. ABC372 (D,E)

    ABC372 (D,E) D 一道比较简单的二分查找题目. 观察到每个数能成为 \(j\) 的条件是独立的,因此想到统计每个数能成为它前面哪些数的 \(j\). 对于每个\(ed​\), 二分 \(1 ...

  2. 实证化讨论OpenAI的ChatGPT的政治倾向性

  3. games101_Homework3

    在Raster部分实现数值插值,然后实现四种不同的像素着色器 作业描述: 作业1:修改函数 rasterize_triangle(const Triangle& t) in rasterize ...

  4. 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现六

    一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...

  5. mysql8创建用户

    create user test_user@'%' identified by 'test2022@'; grant all privileges on test.* to test_user@'%' ...

  6. luasql报错笔记

    luasql 编译安装 查看mysql配置,注意 lmysqlclient 路径 [root@hmy luasql-master]# yum install mysql-devel gcc* -y [ ...

  7. npm报错error:0308010C:digital envelope routines::unsupported

    error:0308010C:digital envelope routines::unsupported 出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而Open ...

  8. python虚拟环境管理之Pipenv

    GitHub:pypa/pipenv: Python Development Workflow for Humans. (github.com) 介绍: pipenv就是把pip和virtualenv ...

  9. web移动端屏幕适配方案

    因为手机屏幕的分辨率大小不一 ,如果使用传统的静态布局,把每个元素的宽高样式写死,在不同的屏幕中就有各种各样的显示效果.这显然不是我们想要的结果.我们需要的是根据屏幕分辨率的不同,来适配不同的样式大小 ...

  10. 微信小程序手机号登录

    import { wxPhoneLogin, getPhoneNumber } from '../login' // 后端接口 // 服务端接口 - 获取openid function queryOp ...