Flutter 生命周期介绍与使用

Flutter 生命周期简介与使用

Flutter 是一个由 Google 开发的开源 UI 软件开发工具包,用于跨平台应用程序的开发。了解 Flutter 的生命周期对于构建高效且响应式的应用程序至关重要。在这篇博客中,我们将探讨 Flutter 的生命周期管理,包括 Stateful 和 Stateless Widgets 的生命周期方法,以及如何在不同的生命周期阶段管理状态。


1. Flutter Widget 的基础知识

在 Flutter 中,Widget 是一切的基础。Flutter 应用程序中的每一个元素都是一个 Widget。Flutter 提供了两种主要类型的 Widget:

  • StatelessWidget:一个无状态的 Widget,不会根据用户交互进行重建。
  • StatefulWidget:一个有状态的 Widget,它可以根据状态的变化进行更新和重建。

StatelessWidget

StatelessWidget 没有生命周期方法,因为它不会改变状态。其构建方法 (build) 只会在创建时被调用一次。一个典型的 StatelessWidget 看起来如下:

class MyStatelessWidget extends StatelessWidget {Widget build(BuildContext context) {return Container(child: Text('Hello, Flutter!'),);}
}

StatefulWidget

StatefulWidget 拥有更复杂的生命周期,涉及到创建、更新和销毁。下面我们将详细介绍 StatefulWidget 的生命周期方法。


2. StatefulWidget 生命周期

StatefulWidget 有两个类:

  1. StatefulWidget 类:定义一个不变的 Widget。
  2. State 类:包含 Widget 的状态,并负责更新和维护 Widget 的状态。

StatefulWidget 生命周期方法

  1. createState()

    • 在 StatefulWidget 被创建时调用。这个方法用于创建与此 Widget 关联的 State 对象。
    • 实例
      
      _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
      
  2. initState()

    • 在 State 对象创建后立即调用。通常用于初始化数据,如网络请求、动画控制器等。
    • 注意:在这个阶段不能使用 BuildContext 进行构建。
    • 实例
      
      void initState() {super.initState();// 初始化代码
      }
      
  3. didChangeDependencies()

    • 当 State 对象依赖的对象改变时调用。例如,InheritedWidget 更新时会触发此方法。
    • 实例
      
      void didChangeDependencies() {super.didChangeDependencies();// 响应依赖变化
      }
      
  4. build(BuildContext context)

    • 必须实现的方法,用于构建 Widget 的子树。每次 Widget 状态改变时都会被调用。
    • 实例
      
      Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('StatefulWidget Example'),),body: Center(child: Text('Hello, StatefulWidget!'),),);
      }
      
  5. didUpdateWidget(covariant OldWidget oldWidget)

    • 当 Widget 被重新构建时调用,例如父 Widget 的状态改变时。
    • 实例
      
      void didUpdateWidget(covariant MyStatefulWidget oldWidget) {super.didUpdateWidget(oldWidget);// 响应父组件的变化
      }
      
  6. setState(fn)

    • 在需要更新 Widget 的状态并触发重建时调用。
    • 实例
      void _updateText() {setState(() {// 更新状态});
      }
      
  7. deactivate()

    • 在 State 对象从 Widget 树中移除时调用。
    • 实例
      
      void deactivate() {super.deactivate();// 执行必要的清理操作
      }
      
  8. dispose()

    • 在 State 对象永久移除并释放资源时调用,例如取消订阅和释放控制器。
    • 实例
      
      void dispose() {// 释放资源super.dispose();
      }
      

完整示例

class MyStatefulWidget extends StatefulWidget {_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}class _MyStatefulWidgetState extends State<MyStatefulWidget> {String _displayText = 'Hello, Flutter!';void initState() {super.initState();print('initState called');}void didChangeDependencies() {super.didChangeDependencies();print('didChangeDependencies called');}Widget build(BuildContext context) {print('build called');return Scaffold(appBar: AppBar(title: Text('StatefulWidget Lifecycle'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text(_displayText),ElevatedButton(onPressed: _updateText,child: Text('Update Text'),),],),),);}void didUpdateWidget(covariant MyStatefulWidget oldWidget) {super.didUpdateWidget(oldWidget);print('didUpdateWidget called');}void _updateText() {setState(() {_displayText = 'Hello, Flutter with StatefulWidget!';});}void deactivate() {super.deactivate();print('deactivate called');}void dispose() {super.dispose();print('dispose called');}
}

生命周期总结

在 Flutter 的 StatefulWidget 生命周期中,各个方法的调用顺序如下:

  1. createState()
  2. initState()
  3. didChangeDependencies()
  4. build()
  5. didUpdateWidget()
  6. setState()
  7. deactivate()
  8. dispose()

3. Flutter 生命周期的应用场景

3.1 网络请求的管理

在 Flutter 应用中,通常需要在组件加载时发起网络请求并展示数据。可以使用 initState() 来执行一次性的数据加载操作。


void initState() {super.initState();fetchData();
}Future<void> fetchData() async {// 网络请求代码
}

3.2 动画的管理

在 Flutter 中,动画通常与 AnimationControllerTickerProvider 一起使用。需要在 initState() 中初始化控制器,并在 dispose() 中释放资源。

late AnimationController _controller;
void initState() {super.initState();_controller = AnimationController(duration: const Duration(seconds: 2),vsync: this,)..repeat();
}
void dispose() {_controller.dispose();super.dispose();
}

3.3 状态的持久化

在应用中可能需要保存一些重要的数据,即使在应用被销毁后也需要保持状态。可以使用 SharedPreferences 或其他持久化存储方法。

Future<void> _saveData() async {final prefs = await SharedPreferences.getInstance();await prefs.setString('key', 'value');
}Future<void> _loadData() async {final prefs = await SharedPreferences.getInstance();String? value = prefs.getString('key');
}

4. 示例应用

下面是一个使用 Flutter 生命周期的完整示例应用,它展示了一个计数器应用程序,在用户按下按钮时更新计数,并在屏幕重新加载时保存状态。

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Lifecycle Demo',home: CounterScreen(),);}
}class CounterScreen extends StatefulWidget {_CounterScreenState createState() => _CounterScreenState();
}class _CounterScreenState extends State<CounterScreen> {int _counter = 0;void initState() {super.initState();_loadCounter();}Future<void> _loadCounter() async {final prefs = await SharedPreferences.getInstance();setState(() {_counter = prefs.getInt('counter') ?? 0;});}Future<void> _incrementCounter() async {setState(() {_counter++;});final prefs = await SharedPreferences.getInstance();await prefs.setInt('counter', _counter);}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Flutter Lifecycle Demo'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('You have pushed the button this many times:',),Text('$_counter',style: Theme.of(context).textTheme.headlineMedium,),ElevatedButton(onPressed: _incrementCounter,child: Text('Increment'),),],),),);}void dispose() {super.dispose();print('dispose called');}
}

示例应用要点

  • 使用 SharedPreferences 持久化计数器值,以便在应用重新启动时恢复状态。
  • 使用 initState() 方法加载初始数据。
  • 使用 setState() 方法更新 UI。

5. 结论

掌握 Flutter 的生命周期是开发响应式和高性能应用的关键。在这篇博客中,我们探讨了 StatelessWidget 和 StatefulWidget 的生命周期及其使用场景,并通过示例展示了如何在应用中使用这些生命周期方法。

通过对生命周期的深入理解,开发者可以更好地管理应用的状态和资源,从而构建出更加流畅和用户友好的应用程序。

希望这篇博客能帮助您更好地理解和运用 Flutter 的生命周期!如果您有任何问题或建议,欢迎在评论区留言讨论。

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

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

相关文章

3D模型可视化引擎HOOPS Luminate功能一览:实时渲染(二)

HOOPS Luminate是一款专为图像可视化设计的C编程工具包。它通过一个统一的集成API&#xff0c;全面覆盖了实时2D、实时3D以及照片级逼真渲染的图形功能。在处理大型数据组件的显示方面&#xff0c;HOOPS Luminate展现出了卓越的性能&#xff0c;并且具备高度的可定制性和灵活性…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU&#xff0c;MSS&#xff0c;分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

VScode使用Github Copilot插件时出现read ECONNREST问题的解决方法

文章目录 read ECONNREST查看是否仍是 Copilot 会员查看控制台输出网络连接问题浏览器设置问题笔者的话 read ECONNREST 最近使用 Copilot 时一直出现 read ECONNREST 问题&#xff0c;这个表示连接被对方重置了&#xff0c;就是说在读取数据时连接被关闭。 我首先怀疑是不是…

springboo 整合 redis

springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…

PostgreSQL的pg-collector工具

PostgreSQL的pg-collector工具 pg-collector 是一个用于 PostgreSQL 数据库的监控和数据收集工具。它主要用于收集 PostgreSQL 实例的性能指标、查询统计和日志信息&#xff0c;以便进行数据库性能分析和故障排查。通过收集这些数据&#xff0c;管理员可以更好地了解数据库的运…

盘点2024年网上很火的4个语音识别转文字工具。

语音识别转文字是一项非常实用的技术&#xff0c;可以帮助我们在会议记录中省去手动记录&#xff0c;在采访中迅速得到文字稿&#xff0c;在学习中快速生成课堂笔...运用十分广泛。但是很多人不知道要怎么转换&#xff0c;在这里我便给大家介绍几款效率非常高的语音转文字的工具…

python 裁剪图片

情况&#xff1a; 有时候看视频&#xff0c;看到一个漂亮的妹子&#xff0c;按下 Alt PrintScreen 进行截图之后&#xff0c;会把整个屏幕都截图。 需要适当剪裁一下。 每次打开 PS &#xff0c; 也太慢了。 所以写个代码&#xff0c; 快速处理。 效果对比&#xff1a; 原始…

轨道式智能巡检机器人,助力综合管廊安全运维

1 引言 当前城市综合管廊建设已经成为世界范围内的发展趋势&#xff0c;2017年5月住建部、发改委联合发布《全国城市市政基础设施建设“十三五”规划》&#xff0c;截至2017年4月底国内地下综合管廊试点项目已开工建设687 km&#xff0c;建成廊体260 km&#xff0c;完成投资40…

MSSQL注入前置知识

简述 Microsoft SQL server也叫SQL server / MSSQL&#xff0c;由微软推出的关系型数据库&#xff0c;默认端口1433 常见搭配C# / .net IISmssql mssql的数据库文件 数据文件&#xff08;.mdf&#xff09;&#xff1a;主要的数据文件&#xff0c;包含数据表中的数据和对象信息…

使用update-alternatives管理GCC版本

使用update-alternatives管理GCC版本 简介操作过程 简介 当操作系统中存在多个版本的GCC时&#xff0c;可以使用使用update-alternatives管理默认使用的编译器版本。 本文使用gcc-9和gcc-11做演示&#xff0c;操作系统为ubuntu-20.04 操作过程 ①使用以下命令确认gcc已正确…

Ubuntu22.04重装系统+基础配置

重装系统 note&#xff1a;备份数据&#xff0c;重装系统后home下的文件会丢失&#xff0c;所以先备份一下home的数据到其他的盘/mnt/下里。记住之前系统的DNS&#xff0c;IP和掩码。 先在Ubuntu官网下载22.04桌面版&#xff08;种子链接要用迅雷下载&#xff09;。但是版本还…

橙单前端项目下载编译遇到的问题与解决

今天下载orange-admin前端项目&#xff0c;不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误&#xff0c;如下&#xff1a; 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了&#xff0c;可能是原作者…

隆尧县“隆品佳尧”区域公用品牌发布推介会暨地标之都七月选品会成功举办

在国家乡村振兴战略与农业现代化建设的大背景下&#xff0c;隆尧县凭借其得天独厚的地理优势和丰富的自然资源&#xff0c;正在成为区域经济与品牌建设的一颗新星。为了进一步推动隆尧县的农业发展和乡村建设&#xff0c;由隆尧县商务局指导、隆尧县电子商务公共服务中心主办的…

【leetcode 详解】生成特殊数字的最少操作【中等】(C++思路精析)

题目见下&#xff1a; 测试数据: 解题思路笔记&#xff1a; 最初拿到这道题是很蒙的&#xff0c;联想不到什么数据结构的模型&#xff08;肯定是笔者积累太少了&#xff09;&#xff0c;甚至惯性地想怎么实现“删除数字”的操作&#xff1a;在原字符串中抽出一个字符然后将剩…

南非云手机:助力企业在南非的商业活动

中国企业在南非的商业活动涵盖了多个领域&#xff0c;包括基础设施建设、采矿业、制造业、能源、电信、金融服务等。随着中国企业在南非的不断扩展&#xff0c;如何高效管理业务和保护数据安全成为了重要课题&#xff0c;而南非云手机为企业提供了强大的技术支持和便利的管理工…

神经网络与注意力机制的权重学习对比:公式探索

神经网络与注意力机制的权重学习对比&#xff1a;公式探索 注意力机制与神经网络权重学习的核心差异 在探讨神经网络与注意力机制的权重学习时&#xff0c;一个核心差异在于它们如何处理输入数据的权重。神经网络通常通过反向传播算法学习权重&#xff0c;而注意力机制则通过学…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

C语言百分号打印器

目录 开头程序程序的流程图程序输入与输出的效果例1输入输出 例2输入输出 例3输入输出 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语言编译的百分号打印器和与之相关的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <…

05 循环神经网络

目录 1. 基本概念 2. 简单循环网络 2.1 简单循环网络 2.2 长程依赖问题 3. 循环神经网络的模式与参数学习 3.1 循环神经网络的模式 3.2 参数学习 4. 基于门控的循环神经网络 4.1 长短期记忆网络 4.2 LSTM网络的变体网络 4.3 门控循环单元网络 5. 深层循环神经网络…

怀旧必玩!重返童年,扫雷游戏再度登场!

Python提供了一个标准的GUI&#xff08;图形用户界面&#xff09;工具包&#xff1a;Tkinter。它可以用来创建各种窗口、按钮、标签、文本框等图形界面组件。 而且Tkinter 是 Python 自带的库&#xff0c;无需额外安装。 Now&#xff0c;让我们一起来回味一下扫雷小游戏吧 扫…