Widgets 是什么?

Widgets 翻译成中文就是小插件的意思WidgetsFlutter用户界面的基础;你在 flutter 界面中能够观察到的用户界面,都是 Widgets

当然这些大的 Widgets 又是由一个个的小的Widgets 组成的,而这些小的 Widgets 又是由更小的 Widgets 组成的;这样就构成了 Widgets层次依赖结构,这些层次结构关联关系是通过 Widget 中的 child Widget 进行关联

在这种层次结构中,子 Widgets 可以共享父 Widgets 的上下文环境

Flutter 中的 Widgets 跟其他语言中的类似的 Widgets 组合有什么不同呢?

他们最大的不同是,Flutter 中的 Widgets 更多,每个 Widgets 专注功能更小;即便是一个很小很小功能,在 Flutter 中都可以找到与之对应的 Widgets

这样做的好处就是,你可以使用不同的,非常基础的 Widgets 任意组合,从而构建出非常复杂的,个性化大的 Widgets

当然,它的缺点也非常明显,就是代码里面的 Widgets 太多了,导致代码中的层级结构特别的多,可能会看的眼花缭乱

举个简单的例子Container 是 flutter 提供的一个基本的容器 Widget,我们通常这样来使用它:

 Container(constraints: BoxConstraints.expand(height: Theme.of(context).textTheme.headline4!.fontSize! * 1.1 + 200.0,),padding: const EdgeInsets.all(8.0),color: Colors.blue[600],alignment: Alignment.center,child: Text('Hello World',style: Theme.of(context).textTheme.headline4!.copyWith(color: Colors.white)),transform: Matrix4.rotationZ(0.1),)

我们向 Container 中传入了 constraints,padding,color,alignment,child,transform 等信息

我们先来猜一下,这些信息中,哪些是用来构建 Widget 的?

大家第一时间想到的应该是 child,它本身就是一个 Widget,用来表示 Container 中包含的子对象,这个很好理解

但是,除了 child 这个 Widget 之外,其他的 constraints,padding,color,alignment,transform 等都是构成 Widget 的元素!

我们来看下 Container 的 build 方法:

 Widget build(BuildContext context) {Widget? current = child;
if (child == null && (constraints == null || !constraints!.isTight)) {current = LimitedBox(maxWidth: 0.0,maxHeight: 0.0,child: ConstrainedBox(constraints: const BoxConstraints.expand()),);
}if (alignment != null)current = Align(alignment: alignment!, child: current);final EdgeInsetsGeometry? effectivePadding = \_paddingIncludingDecoration;
if (effectivePadding != null)current = Padding(padding: effectivePadding, child: current);if (color != null)current = ColoredBox(color: color!, child: current);if (clipBehavior != Clip.none) {assert(decoration != null);current = ClipPath(clipper: \_DecorationClipper(textDirection: Directionality.maybeOf(context),decoration: decoration!,),clipBehavior: clipBehavior,child: current,);
}if (decoration != null)current = DecoratedBox(decoration: decoration!, child: current);if (foregroundDecoration != null) {current = DecoratedBox(decoration: foregroundDecoration!,position: DecorationPosition.foreground,child: current,);
}if (constraints != null)current = ConstrainedBox(constraints: constraints!, child: current);if (margin != null)current = Padding(padding: margin!, child: current);if (transform != null)current = Transform(transform: transform!, alignment: transformAlignment, child: current);return current!;

从代码中可以看到,Container 先是创建了 LimitedBox,然后将其嵌入到 Align 中,再依次嵌入到 Padding,ColoredBox,ClipPath,DecoratedBox,ConstrainedBox,Padding 和 Transform 中;这些所有的对象都是 Widget

这里应该可以理解 Flutter 中 Widget 的设计思想了;在 Flutter 中一切皆可为 Widget

Widgets 的可扩展性

和其他的编译成原生语言特性的跨平台实现如 React native 相比,Flutter 对于每个 UI 都有自己的实现,而不是依赖于操作系统提供的接口

这样做的好处就是一切都是由 Flutter 自己控制的,使用者可以在 Flutter基础上进行无限扩展,而不用受限于系统底层的实现限制

另一方面,这样可以减少 Flutter 在呈现过程中在 Flutter 代码和平台代码之间来回转换,减少了性能瓶颈,提升效率

最后,因为 UI 的实现和底层的操作系统是分离的,所以 Flutter 的 APP 在不同的平台上面可以有统一的外观和实现,可以保证风格的统一

Widgets 的状态管理

Widgets 表示的是不可变的用户 UI 界面结构;虽然结构是不能够变化的,但是 Widgets 里面的状态是可以动态变化

根据 Widgets 中是否包含状态,Widgets 可以分为 stateful 和 stateless widget,对应的类是 StatefulWidget 和 StatelessWidget

对于有些 Widgets 来说,比如 icon 或者Label它里面本身就不需要状态,这些 Widgets 就是 StatelessWidget

但是如果有些 Widgets 中的某些内容可能需要根据用户或者其他原因来动态变化,则就需要使用 StatefulWidget

之前提到了 Widgets不可变的StatefulWidget 中的可变数据是存放在对应的 State 中的,所以 StatefulWidgets 本身没有 build 方法,所有用户界面都是通过 State 对象来构建的

当 State 发生变化的时候,需要调用 setState() 方法来通知 flutter 框架来调用 State 的 build 方法,从而将变化反馈到用户界面中

至此,我们今天关于 Flutter 框架 中的 Widgets 特性知识点就介绍到这里了;希望以上的内容能够对大家有所帮助,关于 Flutter 的相关技术问题,我们还要去好好的学习剖析;因此我把工作中遇到的 Flutter 组件开源库相关问题,以及对网上大部分的资料的收集和整理,最终整合出了一份 《Flutter 高级开发学习笔记》

有需要这份学习笔记的朋友,可以 私信 发送 “笔记” 即可 免费获取 希望大家通过阅读这份学习笔记,能够查漏补缺;早日精通 Flutter

内容展示如下:

Dart 语法基础
  • Dart 语法详解
  • 编译原理
  • Dart 语言基础详解(变量、内置类型、函数、操作符、流程控制语句)
  • Flutter(Dart)基础——类的详解
  • Dart 初始化列表
  • Dart 的构造方法及属性(setter/getter)
  • Dart 构造方法
  • Dart 的工厂构造方法
  • Dart 之 Mixin 详解

Dart 语法进阶
  • Exception 类型
  • Error 类型
  • 异常抛出
  • 异常捕获
  • 泛型
  • 异步

完整版 Flutter 高级开发学习笔记 获取方式: 私信 发送 “笔记” 即可 免费获取
Flutter 3.0 之 UI
  • 列表和网格视图 Widget
  • 布局 Widget
  • AbsListView 常用属性和相关方法
  • 常用适配器介绍与使用
  • ListView 详细介绍与使用
  • GridView 详解与应用
  • GridView 主要使用方法
  • GridView 使用 Demo
  • 布局 Widget

Flutter 学习笔记目录:

文章篇幅有限资料就不做完全展示了;有需要这份 Flutter 高级开发学习笔记 的朋友: 私信 发送 “笔记” 即可 免费获取

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

最后祝各位开发者早日精通 Flutter ,攀登上更高的高峰

Flutter 跨平台框架中的 Widgets,你了解多少?相关推荐

  1. Flutter 跨平台框架应用实战-2019极光开发者大会

    大家好,我是郭树煜,掘金 <Flutter 完整开发实战详解> 系列的作者,Github GSY 系列开源项目的维护人员,系列包括 GSYVideoPlayer .GSYGitGithub ...

  2. 太赞了!实战讲述Flutter跨平台框架应用,挥泪整理面经

    前言 这篇文章主要是分享今年上半年的面试心得,现已就职于某大厂有三个月了,近期有很多公司均已启动秋招,也祝大家在 2020 的下半年面试顺利,获得理想的offer! 之前找工作的那段时间感想颇多,总结 ...

  3. 实战讲述Flutter跨平台框架应用,帮你突破瓶颈

    背景 曾经有人问我,为什么要下班了不找点乐子,还花这么多时间去写一份资料.你是不是傻! 我无言以对! 但是不得不说,这份笔记确实倾注了我很多心血. 至于,我为什么要做这份资料,为什么又要写这篇文章!是 ...

  4. flutter跨平台开发之App升级方案

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 精通点的可以查看这里 精述 Flutter 从入门实践到开发一个APP之UI基础篇 视频 Flutter 从 ...

  5. 浅谈跨平台框架 Flutter 的优势与结构

    作者:个推iOS工程师 伊泽瑞尔 一.背景 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平台上,使用平台所支持的开发工具和语言,直接调用系统提供的API所开发 ...

  6. [译]哪个跨平台框架才是最好的选择?React Native、Flutter 还是 Ionic

    关注 前端瓶子君,回复"交流" 加入我们一起学习,天天进步 原文地址:React Native vs. Flutter vs. Ionic 原文作者:Sophia Martin 译 ...

  7. 腾讯 Flutter 跨平台 Web 实践

    点击上方"开发者技术前线",选择"星标" 每天 14.00 在看 | 真爱 来源:腾讯新闻前端团队   |  作者  SegmentFault Flutter是 ...

  8. 10分钟了解Flutter跨平台运行原理!

    导语 | 本文将从选型.简介和运行原理三大部分为你介绍Flutter的相关概念,希望能站在框架设计和实现原理的高度,带领大家去理解Flutter区别其他跨平台解决方案的关键所在. 一.为什么选择Flu ...

  9. 最新前端跨平台框架推荐,跨平台开发框架选择指南

    现在跨平台开发不是新鲜事了,各个跨平台框架都已经百花齐放,各有千秋.2021都有哪些跨平台框架值得推荐呢?这篇文章就不说石器时代的开平台框架了,当然不靠谱的也不说了,只说能用的! 1. Ract Na ...

最新文章

  1. 关于c++类中的指针成员问题
  2. 纯干货:如何高效的进行需求管理?
  3. 实用 | PyCharm常用快捷键整理
  4. 26计算限制的异步操作01-CLR
  5. 目标检测系列(三)——SPPnet
  6. java 注解数组初始化_Java 之 注解的定义
  7. AI,机器学习(模式识别),深度学习的区别与联系
  8. 把图标变成圆形的html_css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局...
  9. kubernetes CRI接口
  10. 题解 luoguP2928 【[USACO09HOL]牛的打手Cattle Bruisers】
  11. EB-Boost :智慧景区共享单车中长期投放量精准预测方法
  12. python列表(list)
  13. python下载图片插入excel_Python向Excel中插入图片的简单实现方法
  14. centos7软件安装更新
  15. 关联数据赋能智能化业务
  16. java区分登陆者的设备(手机还是电脑)
  17. Unity2DRelative Joint 2D详解
  18. 31页天喻智慧校园解决方案
  19. 【Mybatis】Mybatis批量插入操作【详细教程】
  20. 帝国理工计算机科学硕士学费,去帝国理工学院读研需要几年?一年学费是多少?语言要求都有哪些?...

热门文章

  1. 当经济危机席卷日本时,松下幸之助:生产可以减半,员工不可以裁
  2. GTK+编程入门(2)—GTK+程序结构
  3. Workbench网格划分(1)
  4. 稀疏矩阵的十字链表存储表示和实现(第五章 P104 算法5.4)
  5. R Studio 安装stringi 报错download of package ‘stringi’ failed
  6. 运行javac 报告javac不是内部或外部命令,但是运行java、java-version正常
  7. 上网行为管理_上网行为管理如何预防以及屏蔽勒索病毒攻击
  8. Python操作Excel文件:插入一列数据
  9. python os.system()和os.popen()
  10. Java字符串转Json对象