我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flutter渲染原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flutter渲染原理是什么

这篇文章主要介绍了Flutter渲染原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Flutter渲染原理是什么文章都会有所收获,下面我们一起来看看吧。

Widget Element RenderObject之间的关系

1 Widget

在Flutter 中,万物皆是Widget,无论是可见的还是功能型的。一切都是Widget.

官方文档中说的Widget 使用配置和状态来描述View 界面应该长什么样子。

它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector、用于APP主题数据传递的Theme、布局元素等等

两个重要的方法

一个是通过 createElement 来创建 Element 对象的,

一个是根据 key 来决定更新行为的 canUpdate 方法。

在这个方法中会对比runtimeType (也就是widget 的类型)和 key 是否相同

@immutableabstract class Widget extends DiagnosticableTree {  /// Initializes [key] for subclasses.  const Widget({this.key});  final Key? key;  @protected  @factory  Element createElement();  /// A short, textual description of this widget.  @override  String toStringShort() {    final String type = objectRuntimeType(this, 'Widget');    return key == null ? type : '$type-$key';  }  @override  void debugFillProperties(DiagnosticPropertiesBuilder properties) {    super.debugFillProperties(properties);    properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;  }  @override  @nonVirtual  bool operator ==(Object other) => super == other;  @override  @nonVirtual  int get hashCode => super.hashCode;  static bool canUpdate(Widget oldWidget, Widget newWidget) {    return oldWidget.runtimeType == newWidget.runtimeType &&        oldWidget.key == newWidget.key;  }  // Return a numeric encoding of the specific `Widget` concrete subtype.  // This is used in `Element.updateChild` to determine if a hot reload modified the  // superclass of a mounted element's configuration. The encoding of each `Widget`  // must match the corresponding `Element` encoding in `Element._debugConcreteSubtype`.  static int _debugConcreteSubtype(Widget widget) {    return widget is StatefulWidget        ? 1        : widget is StatelessWidget            ? 2            : 0;  }}

2 Element

Element 就是一个Widget 的实例,在树中详细的位置。

An instantiation of a Widget at a particular location in the tree

3 RenderObject

渲染树上的一个对象。负责具体布局和绘制这些事情。

4 结合图说一下其三者的关系

Flutter渲染原理是什么

从创建到渲染的流程 :

根据Widget 生成Element,然后创建响应的RenderObject并且关联到Element.renderObject 属性。最后再通过RenderObject 来完成布局和绘制。

依赖关系:

Element 树根据Widget 树生成,而渲染树又依赖于widget 树。

5 一些小问题

widget 和 element 是一一对应的吗 ? 为什么 ?

答:是一一对应的。

因为 abstract class Widget ,本身是一个抽象类,这个抽象类中有一个抽象方法叫做createElement(),子类必须实现这个抽象方法,所以是一一对应的。

widget 和 renderObject 是一一对应的吗 ? 为什么 ?

答:不是的

因为只有这个widget 继承自RenderObjectWidget 的时候,才会有对应的renderObject

像类似 Padding , Row,SizedBox,Center 这种组件继承自RenderObjectWidget的组件会有一一对应的关系

//class Padding extends SingleChildRenderObjectWidget// Padding();// class Flex extends MultiChildRenderObjectWidget// Row()

BuildContext 是什么 ?

答:是Element,不管是StatefulWidget 还是StatelessWidget 都会重写父类的build 方法,

build 方法传入的一个参数叫做BuildContext, 我们拿StatelessWidget来说,其本身创建一个StatelessElement,而在这个Element内部重写StatelessElement父类的build方法,而在这个build方法内部会调用_widget.build 方法,并且把this传递进去。那么这个this 就是element 。

/// An [Element] that uses a [StatelessWidget] as its configuration.class StatelessElement extends ComponentElement {  /// Creates an element that uses the given widget as its configuration.  StatelessElement(StatelessWidget super.widget);  @override  Widget build() => (widget as StatelessWidget).build(this);  @override  void update(StatelessWidget newWidget) {    super.update(newWidget);    assert(widget == newWidget);    _dirty = true;    rebuild();  }}

Widget 频繁更改创建是否会影响性能?复用和更新机制是什么样的?

不会影响性能,因为只是一些配置信息,没有有布局渲染到页面上去。中间层Element 会通过widget 的runtimeType 和 Key 来对比是否进行更新操作。

Build 方法会在什么时候调用 ?

Element 创建完毕之后会调用mount 方法,对于非渲染的ComponentElement 来说,mount主要执行的是Widget 中的build 方法。在StatelessElement 中直接使用的是 widget.build(this),

而在StatefullWidget 方法中,通过的是state.build(this)。在StatefulElement 这个类中,

初始化列表的给state 进行了赋值操作。通过widget调用createState方法之后,把state赋值给自己的_state 属性。

StatefulElement(StatefulWidget widget)

: _state = widget.createState(),

createState 方法什么时候调用?

答:创建Element 的时候。

Flutter 会在遍历 Widget 树时调用 Widget 里面的 createElement 方法去生成对应节点的 Element 对象,同时执行 StatefulWidget 里面的 createState 方法创建 state,并且赋值给 Element 里的 _state 属性,当前 widget 也同时赋值给了 state 里的_widget,state 里面有个 widget 的get 方法可以获取到 _widget 对象。

关于“Flutter渲染原理是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Flutter渲染原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flutter渲染原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flutter渲染原理是什么

这篇文章主要介绍了Flutter渲染原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Flutter渲染原理是什么文章都会有所收获,下面我们一起来看看吧。Widget Element RenderObje
2023-07-06

Flutter渲染原理深入解析

众所周知 Flutter是由Google推出的开源的高性能跨平台框架,一个2D渲染引擎。在Flutter中,Widget是Flutter用户界面的基本构成单元,可以说一切皆Widget。下面来看下Flutter框架的整体结构组成
2023-05-15

HTML Mashup渲染原理是什么

这篇文章主要介绍“HTML Mashup渲染原理是什么”,在日常操作中,相信很多人在HTML Mashup渲染原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML Mashup渲染原理是什么”的疑
2023-06-03

Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么

这篇文章主要介绍“Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么”,在日常操作中,相信很多人在Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
2023-07-06

什么是渲染技术?

渲染技术是一种将计算机生成的3D模型转化为屏幕上可见图像的过程。它涉及建模、纹理、着色、光照、阴影和抗锯齿等步骤。有实时渲染和光线跟踪渲染两种类型,每种都有其优缺点。渲染引擎软件用于执行渲染过程,例如Blender、Maya和UnrealEngine。渲染技术广泛应用于娱乐、建筑、产品设计、科学和医学等行业。随着技术发展,渲染技术不断提升,带来更逼真的图像和更广泛的应用。
什么是渲染技术?
2024-04-02

分析vue的渲染是什么

Vue.js 前端框架在前端开发中,是一个十分流行易用的框架。它的渲染机制是Vue.js的核心机制之一,谈及 Vue.js 渲染也是相当深奥的一部分,它的基本原理和底层机制值得我们去一一剖析和探究。Vue.js 的渲染机制是如何运作的呢?在 Vue.js 实际运行的过程中,它首先会将HTML代码转换成虚拟DOM,通过对虚拟DOM进行操作,算法实现高效数据变更以及局部页面重新渲染
2023-05-14

vue为什么是异步渲染

原因:可以提升性能。如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染;所以为了性能考虑,Vue会在本轮数据更新后,再去异步更新视图,而不是每当有数据更新,就立即更新视图。
2023-05-14

layui进度条无法渲染出来的原因是什么

这篇文章给大家分享的是有关layui进度条无法渲染出来的原因是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言:layui进度条渲染分为两种情况,分别是:静态渲染和动态渲染。
2023-06-08

Vue渲染失败的原因是什么及如何解决

本篇内容介绍了“Vue渲染失败的原因是什么及如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Vue渲染失败原因及解决在进行数据双向绑定
2023-06-30

React首次渲染流程是什么

本篇内容介绍了“React首次渲染流程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目在开始进行源码分析前,我们先来看几个题目:题目
2023-07-05

web前端同构渲染是什么

这篇文章主要介绍“web前端同构渲染是什么”,在日常操作中,相信很多人在web前端同构渲染是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”web前端同构渲染是什么”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-04

echarts无法渲染的原因及解决方法是什么

常见的echarts无法渲染的原因及解决方法如下:原因:1. 引入echarts的路径不正确:可能是路径写错或者文件未正确引入。2. 数据格式不正确:echarts要求传入正确的数据格式,如果数据格式不正确,可能导致无法渲染。3. 容器大小
2023-10-08

React更新渲染原理深入分析

什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你对这些问题还不是很明白,那么可以在这篇文章中找到答案
2022-12-23

Hybris CommerceUI tag的渲染逻辑是什么

这篇文章主要介绍“Hybris CommerceUI tag的渲染逻辑是什么”,在日常操作中,相信很多人在Hybris CommerceUI tag的渲染逻辑是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-06-04

ReactQuery渲染优化的方法是什么

这篇文章主要介绍“ReactQuery渲染优化的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ReactQuery渲染优化的方法是什么”文章能帮助大家解决问题。isFetching在之前的
2023-07-04

Vue.js条件渲染和列表渲染以及Vue中key值的内部原理

这篇文章主要介绍了Vue.js条件渲染和列表渲染,以及Vue中key值的内部原理,文中有详细的代码示例,感兴趣的同学可以参考阅读
2023-05-15

vue是异步渲染的原因有哪些

这篇文章主要介绍了vue是异步渲染的原因有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue是异步渲染的原因有哪些文章都会有所收获,下面我们一起来看看吧。原因:可以提升性能。如果不采用异步更新,那么每次更
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录