Flutter开发入门——Widget和常用组件

1.什么是Widget?

在Flutter中几乎所有的对象都是一个 widget 。与原生开发中“控件”不同的是,Flutter 中的 widget 的概念更广泛,它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector 、用于APP主题数据传递的 Theme 等等,而原生开发中的控件通常只是指UI元素。可以说,万物皆可Widget。

2.StatelessWidget

StatelessWidget用于不需要维护状态的场景,它通常在build方法中通过嵌套其他 widget 来构建UI,在构建过程中会递归的构建其嵌套的 widget 。

例如启屏页面,有时候可能只是一个展示,就进入下一个流程了。

3.StatefulWidget

StatelessWidget一样,StatefulWidget也是继承自widget类,并重写了createElement()方法,不同的是返回的Element 对象并不相同;另外StatefulWidget类中添加了一个新的接口createState()

createState() 用于创建和 StatefulWidget 相关的状态,它在StatefulWidget 的生命周期中可能会被多次调用。例如,当一个 StatefulWidget 同时插入到 widget 树的多个位置时,Flutter 框架就会调用该方法为每一个位置生成一个独立的State实例,其实,本质上就是一个StatefulElement对应一个State实例。

4.State

一个 StatefulWidget 类会对应一个 State 类,State表示与其对应的 StatefulWidget 要维护的状态,State 中的保存的状态信息可以:

  1. 在 widget 构建时可以被同步读取。
  2. 在 widget 生命周期中可以被改变,当State被改变时,可以手动调用其setState()方法通知Flutter 框架状态发生改变,Flutter 框架在收到消息后,会重新调用其build方法重新构建 widget 树,从而达到更新UI的目的。

State 中有两个常用属性:

  1. widget,它表示与该 State 实例关联的 widget 实例,由Flutter 框架动态设置。注意,这种关联并非永久的,因为在应用生命周期中,UI树上的某一个节点的 widget 实例在重新构建时可能会变化,但State实例只会在第一次插入到树中时被创建,当在重新构建时,如果 widget 被修改了,Flutter 框架会动态设置State. widget 为新的 widget 实例。

  2. context。StatefulWidget对应的 BuildContext,作用同StatelessWidget 的BuildContext。

4.1 State生命周期

一个例子来说明

class _CounterWidgetState extends State<CounterWidget> {int _counter = 0;@overridevoid initState() {super.initState();//初始化状态_counter = widget.initValue;print("initState");}@overrideWidget build(BuildContext context) {print("build");return Scaffold(body: Center(child: TextButton(child: Text('$_counter'),//点击后计数器自增onPressed: () => setState(() => ++_counter,),),),);}@overridevoid didUpdateWidget(CounterWidget oldWidget) {super.didUpdateWidget(oldWidget);print("didUpdateWidget ");}@overridevoid deactivate() {super.deactivate();print("deactivate");}@overridevoid dispose() {super.dispose();print("dispose");}@overridevoid reassemble() {super.reassemble();print("reassemble");}@overridevoid didChangeDependencies() {super.didChangeDependencies();print("didChangeDependencies");}
}

由A页面路由到B界面

会依次调用

I/flutter ( 5436): initState
I/flutter ( 5436): didChangeDependencies
I/flutter ( 5436): build

各个方法的作用

  • initState:当 widget 第一次插入到 widget 树时会被调用,对于每一个State对象,Flutter 框架只会调用一次该回调,所以,通常在该回调中做一些一次性的操作,如状态初始化、订阅子树的事件通知等

  • didChangeDependencies():当State对象的依赖发生变化时会被调用;

  • build():它主要是用于构建 widget 子树的,会在如下场景被调用:

    1. 在调用initState()之后。
    2. 在调用didUpdateWidget()之后。
    3. 在调用setState()之后。
    4. 在调用didChangeDependencies()之后。
    5. 在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其他位置之后。
  • reassemble():此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。

  • didUpdateWidget ():在 widget 重新构建时,Flutter 框架会调用widget.canUpdate来检测 widget 树中同一位置的新旧节点,然后决定是否需要更新,如果widget.canUpdate返回true则会调用此回调。正如之前所述,widget.canUpdate会在新旧 widget的 key 和 runtimeType 同时相等时会返回true,也就是说在在新旧 widget 的key和runtimeType同时相等时didUpdateWidget()就会被调用。

  • deactivate():当 State 对象从树中被移除时,会调用此回调。在一些场景下,Flutter 框架会将 State 对象重新插到树中,如包含此 State 对象的子树在树的一个位置移动到另一个位置时(可以通过GlobalKey 来实现)。如果移除后没有重新插入到树中则紧接着会调用dispose()方法。

  • dispose()当 State 对象从树中被永久移除时调用;通常在此回调中释放资源。

4.2 在 widget 树中获取State对象

Flutter有一种通用的获取State对象的方法——通过GlobalKey来获取! 步骤分两步:

  1. 给目标StatefulWidget添加GlobalKey

    //定义一个globalKey, 由于GlobalKey要保持全局唯一性,我们使用静态变量存储
    static GlobalKey<ScaffoldState> _globalKey= GlobalKey();
    ...
    Scaffold(key: _globalKey , //设置key...  
    )

2.通过GlobalKey来获取State对象

_globalKey.currentState.openDrawer()

GlobalKey 是 Flutter 提供的一种在整个 App 中引用 element 的机制。如果一个 widget 设置了GlobalKey,那么我们便可以通过globalKey.currentWidget获得该 widget 对象、globalKey.currentElement来获得 widget 对应的element对象,如果当前 widget 是StatefulWidget,则可以通过globalKey.currentState来获得该 widget 对应的state对象。

 5.Flutter里的基础组件

基础组件
  • Text:该组件可让您创建一个带格式的文本。
  • Row,Column: 这些具有弹性空间的布局类 widget 可让您在水平(Row)和垂直(Column)方向上创建灵活的布局。其设计是基于 Web 开发中的 Flexbox 布局模型。
  • Stack: 取代线性布局 (译者语:和 Android 中的FrameLayout相似),[Stack]允许子 widget 堆叠, 你可以使用 Positioned来定位他们相对于Stack的上下左右四条边的位置。Stacks是基于Web开发中的绝对定位(absolute positioning )布局模型设计的。
  • Container: 可让您创建矩形视觉元素。Container 可以装饰一个BoxDecoration, 如 background、一个边框、或者一个阴影。 Container也可以具有边距(margins)、填充(padding)和应用于其大小的约束(constraints)。另外, Container可以使用矩阵在三维空间中对其进行变换。
Material组件

Flutter 提供了一套丰富 的Material 组件,它可以帮助我们构建遵循 Material Design 设计规范的应用程序。Material 应用程序以MaterialApp组件开始, 该组件在应用程序的根部创建了一些必要的组件,比如Theme组件,它用于配置应用的主题。 是否使用MaterialApp完全是可选的,但是使用它是一个很好的做法。

常用的组件

PreferredSize

它的作用是指定一个widget的首选尺寸。

在Flutter中,PreferredSize通常用于定制AppBar的尺寸。AppBar是一个常用的顶部导航栏组件,它通常包含一个标题、一些操作按钮和其他自定义的内容。PreferredSize可以用来指定AppBar的高度和宽度,以确保它在UI中占据所需的空间。

例如:

PreferredSize(preferredSize: Size.fromHeight(100),child: AppBar(title: Text('My App'),// 其他AppBar的属性和内容),
)

AutoSizeText

会根据可用空间自动调整文本的大小,以确保文本在给定空间内完整显示,并且尽可能大而清晰可读。

AutoSizeText('This is a long text that will automatically adjust its size to fit the available space.',style: TextStyle(fontSize: 20),minFontSize: 16,maxFontSize: 24,textAlign: TextAlign.center,
)

SizedBox

SizedBox是Flutter中的一个widget,它可以用来指定一个固定尺寸的盒子。

在Flutter中,SizedBox可以用来创建一个具有指定宽度和高度的盒子,无论其子项的大小如何。它可以用于调整布局中的间距、创建固定大小的容器等。

Center

Center是Flutter中的一个widget,它可以将其子项居中显示在父容器中。

CircularPercentIndicator

依赖:percent_indicator: ^4.2.3

CircularPercentIndicator是一个Flutter库中的widget,它可以用来创建一个圆形的进度指示器,显示一个百分比的完成进度。

TextSpan

TextSpan是Flutter中的一个widget,它可以用来创建富文本(Rich Text)。

ListView

它可以用来创建一个可滚动的列表视图。

在Flutter中,ListView可以用于显示大量的项目,并且可以根据需要进行滚动。它是一种非常常用的布局方式,用于展示列表数据。

EdgeInsets(这个不是组件)

EdgeInsets是Flutter中的一个类,用于定义边距(padding)和边界(margin)。

在Flutter中,EdgeInsets可以用于在布局中设置小部件的边距和边界。它可以应用于各种小部件,例如Container、Padding、ListView等。

EdgeInsets类提供了多个构造函数和属性,用于指定边距和边界的值。一些常用的属性包括:

  • EdgeInsets.all:设置所有边的边距或边界的值。
  • EdgeInsets.symmetric:设置水平和垂直方向上的对称边距或边界的值。
  • EdgeInsets.only:设置特定边的边距或边界的值。
  • EdgeInsets.fromLTRB:设置左、上、右、下边的边距或边界的值。

Scaffold

用于创建具有基本应用程序布局的屏幕。

在Flutter中,Scaffold提供了一个基本的应用程序布局结构,包括应用栏、抽屉菜单、底部导航栏等。它还提供了一些常用的小部件,如FloatingActionButton、SnackBar等,以方便构建应用程序界面。

Scaffold(appBar: AppBar(title: Text('My App'),),body: Center(child: Text('Hello, Flutter!'),),floatingActionButton: FloatingActionButton(onPressed: () {// 按钮点击逻辑},child: Icon(Icons.add),),
)

KeyboardVisibilityBuilder

依赖库:flutter_keyboard_visibility: ^6.0.0

KeyboardVisibilityBuilder是一个Flutter小部件,用于检测键盘的可见性并响应相应的变化。

在Flutter中,当键盘弹出或隐藏时,可以使用KeyboardVisibilityBuilder来监听键盘的可见性,并根据需要执行相应的操作。例如键盘可见时,上滚到页面底部;

Expanded

Expanded是Flutter中的一个小部件,用于在布局中占据可用空间的剩余部分。

在Flutter中,Expanded小部件通常与Row、Column或Flex等父级小部件一起使用,以便将子级小部件扩展以填充可用空间。

例如,水平方向的登录信息输入,前面是账号文本,后面是输入框,我们可以把Expanded把输入框包裹设置属性使得输入框尽可能的宽。

SafeArea

SafeArea是Flutter中的一个小部件,用于确保应用程序内容在屏幕上显示时不会被设备的安全区域(例如刘海屏、圆角屏等)遮挡。

在Flutter中,SafeArea小部件可以包裹其他小部件,以确保它们在屏幕上的可见区域内显示,而不会被设备的安全区域遮挡。

例如我在屏幕底部有一个提交按钮,如果不使用SafeArea包裹,可能会出现当我唤出底部导航栏的时候,导航栏会遮挡按钮,或者我有一个列表数据展示,但是因为手机的原边框屏幕导致我的最上面和最下面的数据展示不完整,也可以使用此方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring中事务失效的场景有哪些?

异常捕获处理 在方法中已经将异常捕获处理掉并没有抛出。 事务只有捕捉到了抛出的异常才可以进行处理&#xff0c;如果有异常业务中直接捕获处理掉没有抛出&#xff0c;事务是无法感知到的。 解决&#xff1a;在catch块throw抛出异常。 抛出检查异常 spring默认只会回滚非检…

ChatGPT浪潮来袭!谁先掌握,谁将领先!

任正非在接受采访时说 今后职场上只有两种人&#xff0c; 一种是熟练使用AI的人&#xff0c; 另一种是创造AI工具的人。 虽然这个现实听起来有些夸张的残酷&#xff0c; 但这就是我们必须面对的事实 &#x1f4c6; 对于我们普通人来说&#xff0c;我们需要努力成为能够掌握…

基于STM32的智慧农业管理系统设计与实现

文章目录 一、前言1.1 项目介绍【1】项目功能【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 传感器功能介绍1.4 开发工具的选择 二、EMQX开源MQTT服务器框架三、购买ECS云服务器3.1 登录官网3.2 购买ECS服务器3.3 配置安全组3.4 安装FinalShell3.5 远程登录到云服…

xsslabs靶场通关(持续更新)

文章目录 前言一、level1思路实现 二、levle2思路 三、level3思路实现 四、level4思路实现 五、level5思路实现 六、level6思路实现 七、level7思路实现 八、level8思路实现 九、level9思路实现 前言 本篇文章将介绍在xsslabs这个靶场&#xff08;在不知道源码的前提下&#x…

Linux从0到1——Linux环境基础开发工具的使用(上)

Linux从0到1——Linux环境基础开发工具的使用&#xff08;上&#xff09; 1. Linux软件包管理器yum1.1 yum介绍1.2 用yum来下载软件1.3 更新yum源 2. Linux编辑器&#xff1a;vi/vim2.1 vim的基本概念2.2 vim的基本操作2.3 vim正常模式命令集2.4 vim底行模式命令集2.5 视图模式…

Java初阶数据结构队列的实现

1.队列的概念 1.队列就是相当于排队打饭 2.在排队的时候就有一个队头一个队尾。 3.从队尾进对头出 4.所以他的特点就是先进先出 所以我们可以用链表来实现 单链表实现要队尾进队头出{要有last 尾插头删} 双向链表实现效率高&#xff1a;不管从哪个地方当作队列都是可以的&…

OpenMP 编程模型

OpenMP 内存模型 共享内存模型&#xff1a; OpenMP 专为多处理器/核心、共享内存机器设计&#xff0c;底层架构可以是共享内存UMA或NUM OpenMP 执行模型 基于线程的并行&#xff1a; OpenMP 程序基于多线程来实现并行&#xff0c; 线程是操作系统可以调度的最小执行单元。 …

react 综合题-旧版

一、组件基础 1. React 事件机制 javascript 复制代码<div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&a…

Facebook:连接世界的社交巨人

在当今数字化时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;扮演着连接世界的重要角色。它不仅仅是一个社交网站&#xff0c;更是一个数字化的社交生态系统&#xff0c;影响着全球数十亿用户的生活和交流方式。本文将深入探讨Facebook的起源、用户规模和…

uniapp——第1篇:基于vue语法的、比原生开发屌的小程序开发

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 博主作为大二前端小白&#xff0c;刚刚接触前端微信小程序开发时选择的是基于“…

electron + vtkjs加载模型异常,界面显示类似于图片加载失败的图标

electron vtkjs加载模型显示异常&#xff0c;类似于图片加载失败的效果&#xff0c;如上图。 electron开发版本&#xff1a;13。 解决方法&#xff1a;升级electron版本号。 注意&#xff1a;win7最高兼容electron 22版本。

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现VMD-CN…

c++指针的定义和使用

1、定义一个指针 int a10; //定义指针的语法&#xff1a;数据类型 * 指针变量名&#xff1a;int * p&#xff1b; //让指针记录变量a的地址&#xff1a;p &a; int a 10;int* p; p &a; cout << "a的地址为&#xff1a;" << &a <<…

第二十二节 Java 流(Stream)、文件(File)和IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据&#xff0c;输出流…

社区居民医疗健康系统 微信小程序

设计原则 本社区健康医疗APP采用 Hbuildex技术&#xff0c;使用Java语言开发&#xff0c;充分保证了系统稳定性、完整性。 社区健康医疗APP的设计与实现的设计思想如下&#xff1a; &#xff08;1&#xff09;操作简单方便、系统界面安全良好、简单明了的页面布局、方便查询相…

GPT-4.5 Turbo意外曝光,最快明天发布?OpenAI终于要放大招了!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【计算机网络篇】计算机网络的定义和分类

文章目录 &#x1f354;什么是计算机网络&#x1f5c3;️计算机网络的分类⭐按交换方式分类⭐按使用者分类⭐按传输介质分类⭐按覆盖范围分类⭐按拓扑结构分类 &#x1f6f8;小结 &#x1f354;什么是计算机网络 计算机网络是指将多台计算机或其他网络设备通过通信链路连接起来…

汇编语言程序设计 第2章:8086指令系统简介及寻址方式

文章目录 1. 指针的分类及格式1.1 指令的分类1.2 指令格式 2. 寻址方式MOV指令简介2.1 立即寻址2.2 寄存器寻址2.3 直接寻址2.4 寄存器间接寻址2.5 寄存器相对寻址2.6 基址变址寻址2.7 相对基址变址寻址 3. 数据传送指令3.1 通用数据传送指令3.2 地址传送指令&#xff08;LEA、…

C语言黑魔法第三弹——动态内存管理

本文由于排版问题&#xff0c;可能稍显枯燥&#xff0c;但里面知识点非常详细&#xff0c;建议耐心阅读&#xff0c;帮助你更好的理解动态内存管理这一C语言大杀器 进阶C语言中有三个知识点尤为重要&#xff1a;指针、结构体、动态内存管理&#xff0c;这三个知识点决定了我们…

手把手教你打造研究生个人简历模板|轻松驾驭简历设计

在简历设计中&#xff0c;如何展现自己的学历优势&#xff0c;是很多学生困扰的问题。 下面&#xff0c;我们首先从即时设计中分享一些不同风格的研究生简历模板。 风格多样的免费简历设计模板https://js.design/community?categorysearch&search%E7%AE%80%E5%8E%86&…