Widget

Widget用来保存Element的配置信息,本身为不可变,Element根据Widget内保存的配置信息来管理渲染树,可以多次插入Widget树中,每次Element都要重新装载Widget。
Widget内key属性用来决定依赖这个Widget的Element在Element树中更新或移除。


abstract class Widget {const Widget({ this.key });final Key key;/*** 创建Element*/@protectedElement createElement();/*** 判断更新*/static bool canUpdate(Widget oldWidget, Widget newWidget) {return oldWidget.runtimeType == newWidget.runtimeType&& oldWidget.key == newWidget.key;}
}
Element

Element可以理解为Widget的实例,并且关联在Widget树特定位置上。
Element可以通过widget.createRenderObject获取到RenderObject对象,所以Element同时包含RenderObject和Widget。
Widget不可变,一个Widget可以同时配置多个子Widget树,这时Element用来代表特定位置的Widget。
Element是可变的,子节点数量可以是一个或多个。
生命周期:
1.Flutter framework通过Widget.createElement来创建一个Element。
2.当Widget创建并插入到Widget树中时,framework就会通过mount方法来把这个Widget创建并关联的Element插入到Element树中(其父Element会给出一个位置)。
3.通过AttachRenderObject方法来将RenderObjects关联到Render树上,Widget就会显示在屏幕上。
4.每当执行Rebuild方法,Widget代表的配置信息改变时,如果新老Widget的RuntimeType和key相同,framework就会调用Widget的update方法;如果不同就要先unmounting然后重新装载Widget。
5.当父Element想要移除子Element时,可以通过deactivateChild把子Element从树中移除,然后将子Element加入不活跃列表中,接着framework会将子Element从屏幕中移除。

RenderObject

RenderObject作为渲染树中的对象存在。不会定义约束关系,不对控件的布局管理。在Widget里创建。RenderObject包含parentData属性,用来保存child节点的特定信息。其主要作用就是绘制和布局,点击检测和大小计算。

abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin implements HitTestTarget {ParentData parentData;Constraints _constraints;void layout(Constraints constraints, { bool parentUsesSize = false }) {}void paint(PaintingContext context, Offset offset) { }void performLayout();void markNeedsPaint() {}
}

Flutter之Widget、Element、renderObject相关推荐

  1. Flutter中Widget 、Element、RenderObject角色深入分析

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 本文章将讲述 Widg ...

  2. 学 Flutter 不理解 Widget/Element/Render 三棵树?啥也不是!

    一.导语 Hi,大家好,这里是承香墨影! Flutter 是 Google 发布的跨平台 UI 框架,而其中与 UI 相关的,最重要的就是 Widget & Element & Ren ...

  3. Flutter学习 Widget简介

    目录 1. Widget 概述 1.1 Widget概念 1.2 Widget 分类 2. Widget 接口 3. StatelessWidget 和 StatefulWidget 3.1 Flut ...

  4. Flutter 多子 Widget 布之Stack、Positioned

    文章目录 层叠 Widget 布局 Stack alignment fit overflow Positioned 上文 Flutter 多子 Widget 布局之Flex.Expanded.Wrap ...

  5. Flutter 学习 - Widget 之 对话框

    前言 本篇我们介绍Flutter中常用的对话框,先看下效果图 正文 Flutter 中对话框也是Widget,有两种显示对话框的方法,对于对画框对使用还有特殊要求,我们后面介绍,先来看下这两种方法 1 ...

  6. 【Flutter】仿 Element 样式 Progress 进度条

    先看下整体效果 依赖 在 pubspec.yaml 中依赖 ele_progress:^version 最新版本号在 pub 中查看:ele_progress 地址:https://pub.dev/p ...

  7. ios 从assets加载图片_Flutter图片添加水印功能,Flutter保存Widget为图片

    添加水印,两种实现思路,一种是将图片与水印解码,然后混编再编码,另一种是通过Widget的方式合成. 在这里采用的实现思路是使用层叠布局Stack加载图片以及水印部分,水印部分可能是一个现成的图片也可 ...

  8. Flutter与JS的双向调用、Flutter中Widget与Html混合加载

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Flutter是谷歌推出的最新的移动开发框架. [x1]微信公众号的每日提醒 随时随记 每日积累 随心而过 [x2]各种系列的视频教程 ...

  9. Flutter图片添加水印功能,Flutter保存Widget为图片

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 网易云[玩转大前端]配套课程 EDU配套 教程 Flutter开发的点滴积累系列文章 添加水印,两种实现思路 ...

最新文章

  1. 资源 | 10x Python开发者必读:本月Python文章TOP 10
  2. 2019年上半年收集到的人工智能自然语言处理方向干货文章
  3. paip.http 404错误 的解决
  4. git获取提交记录commit id
  5. springboot特点
  6. mui hello html5 安装,HBuilder开发App Step1——环境搭建,HelloMUI 以及真机调试(示例代码)...
  7. JavaScript之对象序列化详解
  8. [洛谷1533] 可怜的狗狗
  9. linux批量配置文件,linux下根据用户输入批量修改配置文件ip
  10. android 获取emui版本,华为手机为什么有EMUI版本和Android版本?
  11. 七种常用数据分析方法
  12. Facebook广告收费出价方式之cpi
  13. java 造数据_java测试造数据神器JavaFaker
  14. 【使用python获取pdf所需数据】
  15. linux开启(永久)端口
  16. 云计算上安装mysql,redis
  17. 一文看懂:NAS网络存储与SAN、DAS的区别
  18. Autofac深入讲解
  19. 工地安全帽反光衣识别系统 yolov5
  20. 【C进阶】第十篇——数据在内存中的存储

热门文章

  1. C# CreateParams的使用(解决闪屏问题)
  2. Python中获取异常(try Exception)信息
  3. Docker 网络不通的解决方法
  4. eclipse中解决/**/多行注释代码后,格式变乱的问题
  5. 排查IDEA 全局搜索快捷键Ctrl +Shift+F不起作用的原因和解决方法
  6. 命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案
  7. 主机ping不通ubuntu虚拟机的解决方法
  8. 如何在bash脚本中提示用户进行确认? [重复]
  9. ElasticSearch,Sphinx,Lucene,Solr,Xapian。哪种适合哪种用途? [关闭]
  10. 计算机操作系统(八)---虚拟存储器