IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter之Widget、Element、renderObject -> 正文阅读

[移动开发]Flutter之Widget、Element、renderObject

Widget

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


abstract class Widget {
  const Widget({ this.key });
  final Key key;
 
 /**
  * 创建Element
  */
  @protected
  Element 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() {
  }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:42:07  更:2022-02-26 11:44:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 15:40:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码