Flutter中的Tree

这篇具有很好参考价值的文章主要介绍了Flutter中的Tree。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Widget

组合类(Composite Widgets)

如Container、Scaffold、MaterialApp等,以及通过继承StatelessWidget和StatefulWidget的类。

代理类(Proxy Widgets)

如InheritedWidget,这是一种功能型组件,可以高效快捷地实现共享数据的跨组件传递;
InheritedWidget是一个代理类Widget,主要用于在Descendant Widgets之间传递共享信息;
通过使用InheritedWidget,可以在树结构中传递信息,当子类状态变更时,可以通知父类进行对应的变更;
ParentDataWidget主要用于配置Descendant Renderer Widget的布局信息;
与InheritedWidget的作用方向相反,ParentDataWidget为具有多个子类的RenderObjectWidget提供对应的配置等,例如Stack使用已定位好的父类Widget来定位每个子Widget。

绘制类(Render Object Widgets)

这类Widget几乎涵盖了屏幕上看到的所有UI,都是通过继承RenderObjectWidget实现的;
根据对应的Element,可以分为MultiChildRenderObjectWidget、SingleChildRenderObjectWidget和LeafRenderObjectWidget,其中LeafRenderObjectWidget是那些没有子节点的Widget。

StatefulWidget生命周期

可以分为三个阶段:创建、更新和销毁;
在创建阶段中,Widget会触发一系列生命周期方法来响应不同的事件;
这些方法包括createState、initState、didChangeDependencies和build;
createState方法会在Widget被创建时调用,用于创建一个新的State对象;
initState方法会在State对象被创建后调用,用于初始化State对象。didChangeDependencies方法会在State对象依赖的对象发生变化时调用,例如父Widget发生变化时;
build方法会在创建阶段和更新阶段都会被调用,用于构建UI界面;

在更新阶段中,Widget会触发一系列生命周期方法来响应不同的事件;
这些方法包括didUpdateWidget和setState;
didUpdateWidget方法会在Widget属性发生变化时调用,例如父Widget的属性发生变化时;
setState方法会在State对象的状态发生变化时调用,用于更新状态;

在销毁阶段中,Widget会触发一系列生命周期方法来响应不同的事件;
这些方法包括deactivate和dispose;
deactivate方法会在State对象暂时从视图树中移除时调用,例如当页面被覆盖时;
dispose方法会在永久从视图树中移除时调用,通常用于释放所有资源。

Widget的更新条件

setState()方法被调用、依赖的变量或数据发生变化、parent widget发生变化、Widget Tree重建等;
总的来说就是Flutter会递归遍历新旧Widget Tree的节点,对比它们的runtimeType和key属性是否相同,如果相同就会认为不需要更新。

Key

Key共分为LocalKey和GlobalKey,通过比较hashCode来判断两个Key是否相等,在使用中需要注意Key的唯一性;
GlobalKey是一个全局唯一的Key,可以在整个应用中引用;
LocalKey直接继承至Key,它应用于拥有相同父Element的Widget进行比较的情况;
LocalKey包括ValueKey(最常用的Key类型,它将一个值赋予给Key)、ObjectKey(与ValueKey类似,但是ObjectKey使用的是对象的引用)、UniqueKey(每次创建都会生成一个唯一的Key);
PageStorageKey继承自ValueKey,是用于存储用户滚动位置的专用key,以便应用可以保留当前的滚动位置,供后续使用。

二、Element、RenderObject、Paint

从Tree到渲染

对于一个StatefulWidget,当StatefulWidget被插入到Widget Tree中时,Flutter框架会调用其createElement()方法;
createElement()方法返回一个StatefulElement实例,StatefulElement随后被挂载到Element Tree上;

StatefulElement通过调用StatefulWidget的createState()方法来创建一个状态对象(State);
这个状态对象负责管理StatefulWidget的状态,并可以在状态变化时触发重建;

在适当的时机(如widget首次构建或状态变化时),Flutter框架会调用状态对象的build()方法;
build()方法返回一个Widget Tree,这个树描述了应该如何在屏幕上呈现该widget;
StatefulElement会将自身作为BuildContext传入到build()方法中,以便在Widget Tree中可以使用context相关的功能;

build()方法返回的Widget Tree最终会被转换为一系列的RenderObject;
每个widget都有一个对应的RenderObject类型,用于实际的布局和绘制工作;
这个转换过程是通过Widget Tree的深度优先遍历来完成的,每个widget都会调用其自己的createElement()和build()方法来参与这个过程;
最终,每个widget都会与一个或多个RenderObject关联起来,形成一个Render object Tree;

一旦Render object Tree被构建完成,Flutter就会开始布局和绘制过程;
布局过程确定每个render object的大小和位置;
绘制过程则使用Skia图形库(或其他平台特定的图形API)来将render object渲染到屏幕上。

总结

Widget定义了用户界面的结构和样式,是声明性的;
Element是Widget的实例化对象,负责维护UI的状态并与RenderObject进行协调;
RenderObject负责实际的布局和绘制工作,使用Paint对象来执行绘图操作;
Paint定义了绘图操作的样式和效果。文章来源地址https://www.toymoban.com/news/detail-775887.html

到了这里,关于Flutter中的Tree的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio Flutter 开发配置

    近来比较闲,就研究下Flutter 开发,在此记录下studio 配置过程,时间是2023.7.19 1.首先下载 Flutter SDKhttps://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.10.6-stable.zip 2.将压缩包解压,然后把其中的  flutter  目录整个放在你想放置 Flutter SDK 的路径中(例如 

    2024年02月16日
    浏览(47)
  • Flutter 与原生交互(Android,iOS)

    本质上 Flutter 和 原生通信是通过 Channel 来完成的:Flutter中消息的传递是完全异步的; 消息使用 Channel(平台通道) 在客户端(UI) 和主机(p平台) Flutter 与 native端交互三种方式 1.BasicMessageChannel (用于传递字符串和半结构化信息,持续通信使用,例如dart端将服务器的数据陆续传入到

    2024年02月17日
    浏览(52)
  • Android Studio(Flutter)常用快捷键

    快捷键 说明 Ctrl + Alt + M 抽取方法 Ctrl + Alt + W 抽取组件 Alt + Enter 包裹组件 Shift + F6 重命名 Ctrl + Alt + L 代码格式化 Ctrl + Alt + O 删除无用import Ctrl + X 删除光标所在行 Ctrl + D 复制一行代码 Ctrl + C 复制 Ctrl + V 粘贴 Ctrl + Z 撤销 Ctrl + / 注释一行代码 Ctrl + Shift + / 注释一段代码 Ctrl

    2024年02月02日
    浏览(49)
  • android studio使用Flutter Inspector调试布局

    1、点击anroid studio右侧的Flutter Inspector按钮 2、点击展开布局右上角的‘Select Widget  Mode’,即可实现点击相关节点,真机上可以看到相关的方框 如下图  

    2024年02月13日
    浏览(42)
  • ubuntu 上安装flutter dart android studio

    因为国内网站不能使用 使用一下: vi ~/.bashrc 最后添加 export FLUTTER_STORAGE_BASE_URL=https://mirrors.cloud.tencent.com/flutter export PUB_HOSTED_URL=https://mirrors.tuna.tsinghua.edu.cn/dart-pub export PATH=$PATH:/usr/local/go/bin export GOPROXY=https://proxy.golang.com.cn,direct flutter 安装: sudo snap install flutter --classic 查看

    2024年02月11日
    浏览(37)
  • flutter android studio升级java java17

    oricle 网站下载jdk 17 sudo dpkg -i 安装包。 到android-studio 目录, 更新.bashrc里面 然后运行flutter doctor

    2024年04月28日
    浏览(47)
  • Flutter在Android Studio上创建项目与构建模式

    一、安装插件     1、前提条件,安装配置好Android Studio环境     2、安装Flutter和Dart插件          Linux或者Windows平台: 1)、打开 File    Settings。 2)、在左侧列表中,选择 \\\" Plugins \\\" 右侧上方面板选中  \\\"Marketplace\\\" 在搜索框中输入“flutter”,选择Flutter插件,点击“Install”安

    2024年02月04日
    浏览(50)
  • Android Studio导入flutter项目,运行和调试按钮灰色

    解决方法:检查是否设置如下内容: 1.是否配置了Android SDK ,打开 file = project Structure =project 2.是否配置了Flutter SDK,打开 setting = LanguagesFrameworks =Flutter 3.是否配置了main.dart,点击Add Configuration = Flutter 选中当前需运行项目的main.dart路径并命名,配置成功后选中刚刚命名的dart即

    2024年02月11日
    浏览(71)
  • Flutter Android & IOS 获取通讯录联系人列表

    1.在 pubspec.yaml 文件中添加 contacts_service 和 permission_handler 插件的依赖: 2.在你的 Dart 代码中,导入 contacts_service 插件: 3.权限请求: Android 需要在 android/app/src/main/AndroidManifest.xml 文件中添加以下内容: IOS 需要在 ios/Runner/Info.plist 文件中添加以下内容: 在ios系统上如果进行

    2024年02月08日
    浏览(52)
  • Android Studio更新新版本后无法创建flutter项目

    最新更新了AndroidStudio版本,发现无法创建flutter项目。 dart和flutter插件确认都已安装,该有的环境配置都已配置。 最后与同事的插件作比较发现是Android APK Support这个插件没勾选。 勾选后,点击右下角的apply,重启AndroidStudio。 然后去点击File--New--New Flutter Project。

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包