当前位置: 首页 > news >正文

Flutter:StatelessWidget vs StatefulWidget 深度解析

目录

1. 引言

2. StatelessWidget(无状态组件)

2.1 定义与特点

2.2 代码示例

3. StatefulWidget(有状态组件)

3.1 定义与特点

3.2 代码示例

4. StatelessWidget vs StatefulWidget 对比

5. StatefulWidget 生命周期

5.1 生命周期示例

6. 何时选择 StatelessWidget 或 StatefulWidget?

6.1 选择 StatelessWidget

6.2 选择 StatefulWidget

7. 总结

相关推荐


1. 引言

        Flutter 是 Google 开发的跨平台 UI 框架,所有界面元素都是由 Widget 组成。Flutter 中的 Widget 分为 StatelessWidget(无状态组件)StatefulWidget(有状态组件),它们在开发过程中扮演着不同的角色。本文将深入解析这两类组件的特点、适用场景及生命周期,并通过示例代码帮助开发者理解如何正确选择和使用它们。

2. StatelessWidget(无状态组件)

2.1 定义与特点

        StatelessWidget 是指不可变的组件,它的 UI 由 build() 方法描述,并且不会因用户交互或数据变化而发生更新。

主要特点:

  • 组件状态不可变(immutable)。
  • 仅依赖输入数据(final 变量)。
  • build() 方法只会被调用一次,除非父组件触发更新。
  • 适用于静态 UI(如文本、按钮、图标)。

2.2 代码示例

import 'package:flutter/material.dart';class MyStatelessWidget extends StatelessWidget {final String text;const MyStatelessWidget({super.key, required this.text});@overrideWidget build(BuildContext context) {return Text(text);}
}void main() {runApp(MaterialApp(home: Scaffold(body: Center(child: MyStatelessWidget(text: 'Hello, Flutter!'),),),));
}

示例解析

  • MyStatelessWidget 组件接收 text 作为参数,无法在运行时改变。
  • 组件不会因外部状态变化而重新构建,适用于静态文本。

3. StatefulWidget(有状态组件)

3.1 定义与特点

StatefulWidget 适用于 UI 需要动态变化的场景。它由 两部分 组成:

  1. StatefulWidget 类(负责创建 State)。
  2. State(持有可变状态,并控制 UI 更新)。

主要特点:

  • UI 组件可变(mutable)。
  • 通过 setState() 触发 UI 更新。
  • 适用于用户交互、动画、异步数据加载等场景。

3.2 代码示例

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),),home: const MyHomePage(title: 'Flutter Demo Home Page'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary,title: Text(widget.title),),body: Center(child:  Column(children: [Text('Count: $_counter'),ElevatedButton(onPressed: _incrementCounter,child: Text('Increment'),),],)),);}
}

示例解析

  • _incrementCounter 通过 setState() 更新 _counter 变量。
  • 每次按钮点击时,setState() 触发 build() 方法重新执行,刷新 UI。

4. StatelessWidget vs StatefulWidget 对比

特性StatelessWidgetStatefulWidget
是否可变不可变可变
状态管理依赖父组件传递数据组件内部维护状态
适用场景静态 UI(如文本、按钮、图标)交互组件(如计数器、表单)
性能性能较优需要手动管理状态,可能影响性能
快捷创建stlessstful

        例如创建 StatefulWidget,我们输入stful 回车,会自动出现下方代码,而不需要我们自己编写这种格式,自己仅需要修改 build 中的 UI 内容即可。

 

5. StatefulWidget 生命周期

        StatefulWidget 的生命周期由多个回调方法组成,理解这些方法有助于优化组件的性能。

生命周期方法说明
initState()组件创建时调用,仅执行一次,适用于初始化数据。
didChangeDependencies()依赖发生变化时调用,如 InheritedWidget 更新。
build()组件渲染 UI,可能多次调用。
setState()触发状态更新并重新构建 UI。
didUpdateWidget()父组件更新时调用,可用于响应外部数据变化。
dispose()组件销毁时调用,释放资源(如取消网络请求、关闭流)。

5.1 生命周期示例

class LifecycleDemo extends StatefulWidget {@override_LifecycleDemoState createState() => _LifecycleDemoState();
}class _LifecycleDemoState extends State<LifecycleDemo> {@overridevoid initState() {super.initState();print('initState called');}@overrideWidget build(BuildContext context) {print('build called');return Text('Lifecycle Demo');}@overridevoid dispose() {print('dispose called');super.dispose();}
}

6. 何时选择 StatelessWidget 或 StatefulWidget?

6.1 选择 StatelessWidget

  • UI 仅依赖父组件的参数
  • 组件不需要持有内部状态
  • 适用于简单的文本、图标、按钮等静态内容

6.2 选择 StatefulWidget

  • 组件的 UI 需要根据用户交互或数据变化而更新
  • 组件需要维护内部状态,例如计数器、动画、表单输入等
  • 涉及异步数据加载(如网络请求)

7. 总结

  • Flutter 中 Widget 分为 StatelessWidget(无状态组件)和 StatefulWidget(有状态组件)。
  • StatelessWidget 适用于静态 UI,而 StatefulWidget 适用于需要动态更新的 UI。
  • StatefulWidget 依赖 setState() 进行状态更新,并具有完整的生命周期管理。
  • 选择合适的 Widget 类型可以提高应用性能,并优化用户体验。

相关推荐

Flutter 布局入门指南:掌握核心技巧,轻松构建精美界面_flutter 布局详解,必知必会-CSDN博客文章浏览阅读1.3k次,点赞56次,收藏53次。Flutter 的布局系统以其灵活性和高效性著称,但对于刚入门的开发者来说,面对琳琅满目的布局 Widget,可能会感到不知所措。本文将带你快速掌握 Flutter 布局的核心技巧,避开常见陷阱,并提供实用代码示例,助你轻松实现复杂界面设计。_flutter 布局详解,必知必会 https://shuaici.blog.csdn.net/article/details/145752085Android内存优化指南:从数据结构到5R法则的全面策略_android 内存管理指南-CSDN博客文章浏览阅读1.5k次,点赞67次,收藏62次。Android内存优化涉及多个方面,从选择合适的数据结构如ArrayMap和SparseArray以减少内存占用,到避免使用内存开销大的枚举类型。谨慎使用多进程和large heap选项,同时充分利用NDK进行内存管理。图片优化是关键,通过采样、缓存和格式转换等方式减少内存占用。此外,遵循5R法则——释放、回收、减少、重用和检查,确保资源得到有效管理。这些策略共同构成了一套全面的Android内存优化方案,有助于提升应用性能和用户体验。_android 内存管理指南 https://shuaici.blog.csdn.net/article/details/145811726

相关文章:

Flutter:StatelessWidget vs StatefulWidget 深度解析

目录 1. 引言 2. StatelessWidget&#xff08;无状态组件&#xff09; 2.1 定义与特点 2.2 代码示例 3. StatefulWidget&#xff08;有状态组件&#xff09; 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...

Stream流学习

Stream流 把数据放进stream流水线&#xff0c;对数据进行一系列操作&#xff08;中间方法&#xff09;&#xff0c;最后封装&#xff08;终结方法&#xff09;。 Stream.of()允许传入任何参数 常见中间方法 可以对数据进行链式&#xff08;流水线&#xff09;操作&#xff0c;但…...

多视图几何--恢复相机位姿/内参的几种方法

恢复相机位姿的几种方法 1分解投影矩阵 1.1投影矩阵分解为相机内外参矩阵的完整解析 投影矩阵&#xff08;Projection Matrix&#xff09;是计算机视觉中将三维世界点映射到二维像素坐标的核心工具&#xff0c;其本质是相机内参矩阵&#xff08;Intrinsic Matrix&#xff09…...

[数据结构]堆详解

目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 ​编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 &#xff08;一&#xff09;堆排序&#xff08;重点&#xff09; &#xff08;二&#xff09;TOP-K问题 一、堆的概念及结构 堆的…...

领域驱动设计(DDD)与MVC架构:理念对比与架构选择

领域驱动设计&#xff08;DDD&#xff09;与MVC架构&#xff1a;理念对比与架构选择 一、架构之争的本质&#xff1a;业务复杂度驱动技术演进 在软件开发领域&#xff0c;没有银弹式的完美架构&#xff0c;只有适合当前业务场景的合理选择。MVC与DDD的区别本质上是业务复杂度与…...

牛客周赛:84:B:JAVA

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(S…...

【理想解法学习笔记】

目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是&#xff1a;首先建立初始化决策矩阵&#xff0c;而后基于规范化后的初…...

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景&#xff1a; 实现设想&#xff1a; 要创建自动化发布&#xff0c;需要准备一台测试服务器提前安装好java运行所需的环境&#xff0c;JDK版本最好和Windows开发机器上的版本一致&#xff0c;在Jenkins上配置将构建好的jar上传到测试服务器上&#xff0c;测试服务器自动启动…...

Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片&#xff0c;如下图&#xff1a;A104255是主产品的sku <?php/*** 根据图片包导入产品图片&#xff0c;包含子产品和主产品* 子产品是作为主图&#xff0c;主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…...

从零开始的python学习(五)P71+P72+P73+P74

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…...

OpenHarmony5.0分布式系统源码实现分析—软总线

一、引言 OpenHarmony 作为一款面向万物互联的操作系统&#xff0c;其分布式软总线&#xff08;Distributed SoftBus&#xff09;是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络&#xff0c;使得不同设备能够无缝连接、通信和协同工作。本…...

基于SpringBoot实现旅游酒店平台功能六

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…...

代码随想录算法训练营第六十一天 | 108. 冗余连接 109. 冗余连接II

108. 冗余连接 题目链接&#xff1a;KamaCoder 文档讲解&#xff1a;代码随想录 状态&#xff1a;AC Java代码&#xff1a; import java.util.*;class Main {public static int[] father;public static void main(String[] args) {Scanner scan new Scanner(System.in);int n…...

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案&#xff0c;该方案可用于长期和中期的高级推理&#xff0c;与传统的狭窄自上而下的逐步收集相比&#xff0c…...

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

Microsof Visual Studio Code 安装教程(中文设置)

VS Code 是一个免费的代码编辑器&#xff0c;可在 macOS、Linux 和 Windows作系统上运行。启动和运行 VS Code 既快速又简单。VS Code&#xff08;全称 Visual Studio Code&#xff09;是一款由Microsoft 推出的免费、开源、跨平台的代码编辑器&#xff0c;拥有强大的功能和灵活…...

python爬虫:Android自动化工具Auto.js的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Auto.js 简介2. 安装与配置2.1 安装 Auto.js2.2 安装 Python 环境2.3 安装 ADB 工具3. Python 与 Auto.js 结合3.1 通过 ADB 执行 Auto.js 脚本3.2 通过 Python 控制 Auto.js3.3 通过 Python 与 Auto.js 交互4. 常用…...

Unity DOTS从入门到精通之 自定义Authoring类

文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世…...

linux 软件安装(上)

一、基础环境准备 1.1、安装VM 1.2、在VM上导入linux iso镜像&#xff0c;装好linux系统 华为centos镜像下载地址 https://mirrors.huaweicloud.com/centos/ https://mirrors.huaweicloud.com/centos/7.9.2009/isos/x86_64/ 网易centos镜像下载地址 htt…...

php虚拟站点提示No input file specified时的问题及权限处理方法

访问站点&#xff0c;提示如下 No input file specified. 可能是文件权限有问题&#xff0c;也可能是“.user.ini”文件路径没有配置对&#xff0c;最简单的办法就是直接将它删除掉&#xff0c;还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...