深度理解Flutter:有状态Widget与无状态Widget的详细对比

image.png

有状态Widget

什么是有状态Widget (StatefulWidget)

官方解释: 如果用户与 widget 交互,widget 会发生变化,那么它就是 有状态的
有状态的 widget 自身是可动态改变的(基于State)。 例如用户交互而改变 Widget 的 state。
Checkbox、Radio、Slider class - material library - Dart API、 InkWell、Form 和 TextField 都是有状态 widget,它们都是 StatefulWidget 的子类。

Widget 的 状态(state )保存在一个 State 的对象中。 StateWidget 是分离的,当 Widget状态变化时,State 对象调用 setState() 来通知框架去重绘 Widget

如何创建一个有状态Widget

实现一个有状态Widget需要创建两个类:

  • 一个 StatefulWidget 的子类,用来定义一个 widget 类。
  • 一个 State 的子类,包含该widget状态并定义该 widget 的 build() 方法。

我们可以通过 VSCode Flutter 命令补全来快速场景一个 有状态组件:

fstful

image.png

import 'package:flutter/material.dart';class FulStatePage extends StatefulWidget {const FulStatePage({super.key});_FulStatePageState createState() => _FulStatePageState();
}class _FulStatePageState extends State<FulStatePage> {Widget build(BuildContext context) {return Container();}
}
创建StatefulWidget 子类

上面代码中,我创建了一个 FulStatePage 类 继承了 StatefulWidget ,这时它是一个有状态的Widget
框架在 构建 Widget 时会调用 createState()创建管理state ,上面代码中,我们创建了 _FulStatePageState 实例.

class FulStatePage extends StatefulWidget {const FulStatePage({super.key});_FulStatePageState createState() => _FulStatePageState();
}

上面代码详细解释:

  1. FulStatePage类继承自StatefulWidget,表示这是一个具有可变状态的小部件。
  2. 构造函数const FulStatePage({super.key})接收一个可选参数key,用于在构建小部件时标识它。
  3. createState()方法返回一个与FulStatePage关联的状态对象,即_FulStatePageState
  4. _FulStatePageStateFulStatePage对应的状态类,它继承自State类
  5. _FulStatePageState中可以定义和管理该小部件的可变状态,并实现相关的业务逻辑。
  6. 通过重写build()方法,在其中构建小部件树来描述该小部件的外观和行为。
  7. FulStatePage类通常会被作为其他小部件的子部件使用,以提供动态交互和数据驱动的功能。

需要注意的是:

  • FulStatePage类的构造函数使用了const关键字,表示该小部件是不可变的,即其属性在构建后不能更改。
  • key参数用于在小部件树中唯一标识该小部件,以便在进行更新、重建等操作时进行准确定位。
  • createState()方法必须被重写,用于创建与该小部件关联的状态对象
  • 状态对象State负责管理和更新小部件的可变状态,并通过setState()方法通知Flutter框架进行重建。
创建State的子类

_FulStatePageState 类存储可不的信息。

class _FulStatePageState extends State<FulStatePage> {int num = 0; void setNum(){setState(() {++num})}Widget build(BuildContext context) {return Container();}
}

上面代码详细解释:

  1. _FulStatePageState类继承自State<FulStatePage>,表示它是FulStatePage小部件的状态类。
  2. build()方法中,可以构建并返回描述该小部件外观和行为的小部件树。
  3. 当状态发生变化时,build()方法会被调用,以重新构建小部件树来反映新的状态。

需要注意的是:

  • BuildContext context参数提供了与当前小部件相关的上下文信息,可以用于获取主题、媒体查询等。
  • build()方法中,可以使用各种小部件来构建界面,例如Container、Text、Image等。
  • 返回的小部件树描述了该小部件的外观和行为,可以包含其他小部件作为子部件。
  • 可以在build()方法中使用状态对象的属性来动态生成小部件,实现根据状态变化而改变界面的效果。
  • 避免在build()方法中进行耗时操作,以保持应用程序的响应性能。
  • 如果需要更新状态并触发重建,应使用setState()方法。这将通知Flutter框架重新调用build()方法。

无状态Widget StatelessWidget

在Flutter中,无状态小部件(Stateless Widget)是一种不包含可变状态的小部件。它们是不可变的,意味着一旦构建完成,它们的内容就不能再改变。
无状态小部件通过继承StatelessWidget类来创建,并重写build方法来描述其UI。build方法接收一个BuildContext参数,并返回一个小部件树,用于构建界面。

import 'package:flutter/material.dart';class CollectPage extends StatelessWidget {
const CollectPage({super.key,});Widget build(BuildContext context){return Container();}
}

什么时候使用无状态Widget

  1. 当小部件的内容是静态的,不需要根据外部事件或数据进行更新时,可以使用无状态小部件。例如,一个简单的文本展示小部件或一个静态的图标按钮。
  2. 当小部件的状态由父级管理时,可以使用无状态小部件。父级可以通过传递参数来控制子部件的外观和行为。
  3. 当小部件不需要响应用户交互时,可以使用无状态小部件。无状态小部件主要用于展示静态内容,而不涉及与用户的交互。
  4. 当性能要求较高时,无状态小部件比有状态小部件具有更轻量级的性能开销,因为它们不需要维护状态对象。所以,在性能要求较高的场景下,可以考虑使用无状态小部件。

例如一些纯静态展示内容 [文章列表,listview 显示的内容(不需要交互改变weidget), 一些按钮等]
总之,无状态小部件适用于静态内容、由父级管理状态、不需要响应用户交互或对性能要求较高的情况。

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

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

相关文章

微服务(11)

目录 51.pod的重启策略是什么&#xff1f; 52.描述一下pod的生命周期有哪些状态&#xff1f; 53.创建一个pod的流程是什么&#xff1f; 54.删除一个Pod会发生什么事情&#xff1f; 55.k8s的Service是什么&#xff1f; 51.pod的重启策略是什么&#xff1f; 可以通过命令kub…

【ArcGIS微课1000例】0085:甘肃省白银市平川区4.9级地震震中位置图件制作

据中国地震台网正式测定,12月31日22时27分在甘肃白银市平川区发生4.9级地震,震源深度10公里,震中位于北纬36.74度,东经105.00度。 文章目录 一、白银市行政区划图1. 县级行政区2. 乡镇行政区二、4.9级地震图件制作1. 震中位置2. 影像图3. 震中三维地形一、白银市行政区划图…

【51单片机系列】DS1302时钟模块

本文是关于DS1302时钟芯片的相关介绍。 文章目录 一、 DS1302时钟芯片介绍二、DS1302的使用2.1、DS1302的控制寄存器2.2、DS1302的日历/时钟寄存器2.3、片内RAM2.4、DS1302的读写时序 三、SPI总线介绍四、DS1302使用示例 一、 DS1302时钟芯片介绍 DS1302是DALLAS公司推出的涓流…

C++入门【17-C++ 字符串】

C 字符串 C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此&#xff0c;一个以 null 结尾…

MYSQL 深入探索系列六 SQL执行计划

概述 好久不见了&#xff0c;近期一直在忙项目的事&#xff0c;才有时间写博客&#xff0c;近期频繁出现sql问题&#xff0c;今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警&#xff0c;有个6千万的日志表&#xff0c;查询耗时大…

docker应用部署(部署MySql,部署Tomcat,部署Nginx,部署Redis)

Docker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --na…

【Linux】Linux 下基本指令 -- 详解

无论是什么命令&#xff0c;用于什么用途&#xff0c;在 Linux 中&#xff0c;命令有其通用的格式&#xff1a; command [-options] [parameter] command&#xff1a;命令本身。-options&#xff1a;[可选&#xff0c;非必填]命令的一些选项&#xff0c;可以通过选项控制命令的…

Tomcat服务为什么起不来?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 服务跑在Tomcat下面&#xff0c;有时候会遇到Tomcat起不来的情况。目前为止常遇到的情况有如下几种&#xff1a; 1. Tomcat服务…

TMC2208-LA单轴步进驱动器可替代A4988

TMC2208是由德国TRINAMIC公司推出的步进电机驱动&#xff0c;TMC22XX系列步进电机驱动被广泛应用于各个行业。TMC2208为3D打印、相机、扫描仪和其他自动化设备应用提供集成电机驱动器解决方案。同TMC2208一样在3D打印行业运用较多的还有TMC2209/2130/2660/2225/等。另外还有TMC…

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

【LeetCode】20. 有效的括号(Deque的Stack用法)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;20. 有效的括号 代码随想录题解地址&#xff1a;代码随想录 题目简介 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效…

Rust学习笔记005:结构体 struct

在 Rust 中&#xff0c;struct 是一种用于创建自定义数据类型的关键字&#xff0c;它允许你定义和组织数据的结构。struct 可以包含多个不同类型的字段&#xff08;fields&#xff09;&#xff0c;每个字段都有一个名称和一个类型。 定义结构体 下面是一个简单的例子&#xff…

Java学习路线第五篇:微服务框架(2)

这篇则分享Java学习路线第五part&#xff1a;微服务框架 恭喜你已经成功追到第五章节第二篇啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完微服务架构的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 SpringCloudAlibaba …

记chrome的hackbar无法post php://input的问题

尽管hackbar支持post请求体&#xff0c;但是当请求体里面没有等于号的时候&#xff0c;无法post出去&#xff0c;这样如果需要使用php://input绕过waf的时候就没法做。 在开发人员工具的网络里面可以看到不使用等于号的情况下没有荷载。 之后在这里看到了解决方法&#xff0c;…

【揭秘】程序员P1到P10的划分标准,你在哪一级?

程序员从P1到P10的职级体系作用在于为程序员提供了一条清晰的职业发展通道&#xff0c;通过不断提升技术能力和承担更高级别的职责&#xff0c;实现个人成长&#xff0c;并为公司贡献更大价值。 P1、P2&#xff1a;新手村的小伙伴 这两个级别的小伙伴们&#xff0c;可是计算机…

实战入门 K8s剩下三个模块

1.Label Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识&#xff0c;用来对它们进行区分和选择。 Label的特点&#xff1a; 一个Label会以key/value键值对的形式附加到各种对象上&#xff0c;如Node、Pod、Service等等 一个资源对象可以定义任意数量…

docker Mysql-udf-http

1.Mysql-udf-http镜像已上传到dockerhub中 docker pull heidaodageshiwo/mysql-udf-http:v1 2.启动镜像(默认密码root1234) docker run -tid -p 3306:3306 --namemysql-udf-http --privilegedtrue heidaodageshiwo/mysql-udf-http:v1 3.命令 [rootlocalhost ~]# docker im…

【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数

文章目录 &#x1f680;前言&#x1f680;C有何过C之处&#xff1f;&#x1f680;C中的关键字&#x1f680;命名空间✈️为什么要引入命名空间&#xff1f;✈️命名空间的定义✈️如何使用命名空间中的内容呢&#xff1f; &#x1f680;C中的输入和输出✈️C标准库的命名空间✈…

【K8S 二进制部署】部署单Master Kurbernetes集群

目录 一、基本架构和系统初始化 1、集群架构&#xff1a; 2、操作系统初始化配置&#xff1a; 2.1、关闭防火墙和安全机制&#xff1a; 2.2、关闭swap 2.3、根据规划设置主机名 2.4、三台主机全部互相映射 2.5、调整内核参数 3、时间同步&#xff08;所有节点时间必须同…

一文讲透怎么用SPSS做曲线回归分析?

使用SPSS的“曲线估算回归分析”即可。 以下案例节选自《SPSS统计学基础与实证研究应用精解》张甜 杨维忠 清华大学出版社 2023年 12.3 曲线估算回归分析。 下面我们以销售额作为因变量&#xff0c;以营销费用投入作为自变量&#xff0c;开展曲线估算回归分析&#xff0c;SPS…