Flutter - StatefulWidget (有状态的 Widget) 和 生命周期

ops/2025/2/25 15:30:25/

StatefulWidget 

/*** 需求:* 两个按钮,一个计数器* 这里要用到 StatefulWidget,因为 StatelessWidget 通常用来展示固定不变的数据*/
main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: MyHomeContent(),);}
}/*** Widget 中的数据都是不可变的,为何必须定义为 final ?* 因为 Widget 中展示的数据发生变化时辉重新构建整个 Widget* Widget 源码中有 @immutable 注解,(被@immutable注解标明的类或者子类都必须是不可变的)** Flutter 将 StatefulWidget 设计成了两个类,创建 StatefulWidget 时必须创建两个类:* 1 一个类继承自 StatefulWidget,作为 Widget树的一部分* 2 一个类继承自 State,用于记录 StatefulWidget 会变化的状态,并且根据状态的变化,构建出新的 Widget*/
class MyHomeContent extends StatefulWidget {@overrideState<MyHomeContent> createState() => _MyHomeContentState();
}class _MyHomeContentState extends State<MyHomeContent> {var num = 0;@overrideWidget build(BuildContext context) {return Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('计数:$num',style: TextStyle(fontSize: 28,color: Colors.blue,decoration: TextDecoration.none)),Row(mainAxisAlignment: MainAxisAlignment.center,children: [ElevatedButton(onPressed: (){setState(() {num++;});}, child: Icon(Icons.add)),ElevatedButton(onPressed: (){setState(() {num--;});}, child: Icon(Icons.remove))],)],),);}
}

生命周期

main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: MyStatefulWidget(),);}
}class MyStatefulWidget extends StatefulWidget {MyHomeContent(){print('生命周期 ---- MyStatefulWidget的构造方法');}/*** 当 Flutter 构建一个 StatefulWidget 时,会立即调用 createState() 方法。* 这个方法返回一个 State 对象,该对象将管理这个 Widget 的状态。*/@overrideState<MyStatefulWidget> createState() => _MyNumState();
}class _MyNumState extends State<MyStatefulWidget> {_MyNumState(){print('生命周期 ---- _MyNumState的构造方法');}/*** initState() 是 State 对象的初始化方法,只会被调用一次。* 通常在这里进行一些初始化操作,比如订阅流、初始化数据等。*/@overridevoid initState() {super.initState();print('生命周期 ---- _MyNumState的 init方法');}/*** didChangeDependencies() 在 initState() 之后立即调用,* 并且在依赖的 InheritedWidget 发生变化时也会调用。* 通常在这里执行一些依赖于 BuildContext 或 InheritedWidget 的操作。*/@overridevoid didChangeDependencies() {super.didChangeDependencies();print('生命周期 ---- _MyNumState的 didChangeDependencies方法');}/*** build() 方法是构建 Widget 树的核心方法,每次 UI 需要更新时都会调用。* 这个方法必须返回一个 Widget,通常是组合其他 Widget 来构建界面。*/@overrideWidget build(BuildContext context) {print('生命周期 ---- _MyNumState的 build方法');return Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Row(children: [ElevatedButton(onPressed: (){/*** setState() 用于通知 Flutter 框架状态已经改变,需要重新构建 UI。* 调用 setState() 会触发 build() 方法。*/setState(() {});}, child: Icon(Icons.remove))],)],),);}/*** 当父 Widget 重建并传入新的 Widget 配置时,didUpdateWidget() 会被调用。* 通常在这里比较新旧 Widget 的配置,并根据需要更新状态。*/@overridevoid didUpdateWidget(covariant MyStatefulWidget oldWidget) {super.didUpdateWidget(oldWidget);print('生命周期 ---- _MyNumState的 didUpdateWidget方法');}/*** 当 State 对象从 Widget 树中移除时,deactivate() 会被调用。* 通常在这里做一些清理工作,但 State 对象仍然可能被重新插入到树中。*/@overridevoid deactivate() {super.deactivate();print('生命周期 ---- _MyNumState的 deactivate方法');}/*** 当 State 对象从 Widget 树中永久移除时,dispose() 会被调用。* 通常在这里释放资源,比如取消订阅、关闭流等。*/@overridevoid dispose() {super.dispose();print('生命周期 ---- _MyNumState的 dispose方法');}}

 


http://www.ppmy.cn/ops/161226.html

相关文章

Openwrt路由器操作系统

一、什么是 OpenWrt&#xff1f; OpenWrt 是一个基于 Linux 的开源操作系统&#xff0c;主要设计用于嵌入式设备&#xff0c;尤其是路由器。与其说是传统的路由器固件&#xff0c;不如说它是一个路由器操作系统。 传统的路由器固件通常由路由器厂商开发&#xff0c;功能相对固…

AI写代码工具赋能前端开发:高效学习与应用AI前端框架

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着软件开发的模式。在前端开发领域&#xff0c;AI写代码工具的兴起更是掀起了一场革命&#xff0c;为开发者带来了前所未有的效率提升和全新的开发体验。掌握AI前端框架已不再是锦上添花&#xff0c;而是提升竞争…

在LangFlow中集成OpenAI Compatible API类型的大语言模型

一、背景与核心价值 从Dify换到这个langflow真的时各种的不适应啊。 就比如这个OpenAI Compatible API,这不应该是基本操作嘛? 算了,服了,习惯了就好了。咱闲言少叙,正片开始: LangFlow作为LangChain的可视化开发工具,其最大优势在于无需编写代码即可构建复杂的大模型…

14.12 Auto-GPT OutputParser 架构设计:构建安全可控的大模型输出管道

Auto-GPT OutputParser 架构设计:构建安全可控的大模型输出管道 关键词:Auto-GPT 输出解析、结构化响应控制、内容安全过滤、多格式输出适配、错误恢复机制 1. OutputParser 的核心作用与设计挑战 输出解析的三大核心任务: #mermaid-svg-sUqVk51rX50EHefe {font-family:&q…

《论软件的可靠性评价》审题技巧 - 系统架构设计师

论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节&#xff0c;是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容&#xff1a; 首先&#xff0c;本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…

助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全

在数字化转型的浪潮中&#xff0c;越来越多的企业选择私有化部署AI技术&#xff0c;以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术&#xff0c;其技术可以支持企业私有化部署&#xff0c;企业需要一站式服务私有化部署&#xff0c;涵盖硬件采…

Es集群开机重启的设置

Elasticsearch(ES)集群本身没有“开机重启”的设置,因为它的运行依赖于底层的服务器或容器环境。不过,可以通过配置服务器的启动服务或容器的设置,确保 Elasticsearch 在系统启动时自动启动,并在需要时自动重启。以下是一些常见的实现方式: 1. 使用 Systemd(适用于 Lin…

3分钟idea接入deepseek

DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型&#xff0c;背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术&#xff0c;拥有多个版本的模型&#xff0c;如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等&…