Flutter 零基础入门(二十七):Widget 的一生 —— initState、build 与 dispose 全解析

Flutter 零基础入门(二十七):Widget 的一生 ------ initState、build 与 dispose 全解析

在上一篇中,我们正式迈入了 Flutter 的核心领域:

  • StatefulWidget
  • State
  • setState 刷新界面

你已经知道:

状态变化 → UI 自动更新

但你可能还会有这些疑问:

  • 页面什么时候初始化?
  • build 为什么会被调用很多次?
  • 页面关闭时要不要"清理东西"?

这一篇,我们就来回答这些问题。


一、为什么要了解 Widget 生命周期?

在真实 App 中,你一定会遇到:

  • 页面初始化时请求数据
  • 页面进入时启动动画
  • 页面离开时关闭定时器
  • 页面销毁时释放资源

📌 这些事情,都和 Widget 生命周期 有关。


二、什么是 Widget 的生命周期?

简单理解:

一个 StatefulWidget 从"创建"到"销毁"的完整过程

就像人一样:

  • 出生
  • 成长
  • 工作
  • 离开

三、StatefulWidget 的生命周期核心方法

在零基础阶段,你只需要重点掌握 3 个方法

1️⃣ initState()

2️⃣ build()

3️⃣ dispose()


四、initState:页面的"出生时刻"(非常重要)

1️⃣ initState 是什么时候调用?

  • 只调用一次
  • 在页面第一次 build 之前
  • State 创建完成后立即调用

📌 记住一句话:

initState 只会执行一次


2️⃣ 常见用途

  • 初始化变量
  • 请求接口数据
  • 启动动画
  • 初始化控制器(Controller)

3️⃣ 基本写法

dart 复制代码
@override
void initState() {
  super.initState();
  print('页面初始化');
}

⚠️ 注意:

一定要先调用 super.initState()


五、build:页面的"渲染过程"

1️⃣ build 是干嘛的?

根据当前状态,构建 UI

复制代码
@override
Widget build(BuildContext context) {
  return Text('Hello');
}

2️⃣ build 会被调用多少次?

👉 很多次

例如:

  • setState
  • 父组件 rebuild
  • 屏幕尺寸变化

📌 非常重要的一句话:

build 不是初始化方法


3️⃣ build 里不该做的事情 ❌

❌ 请求网络

❌ 启动定时器

❌ 创建只需要一次的对象


六、dispose:页面的"告别时刻"

1️⃣ dispose 是什么时候调用?

  • 页面被移除
  • State 即将销毁
  • 只调用一次

2️⃣ 常见用途

  • 关闭定时器
  • 释放动画控制器
  • 关闭 Stream
  • 清理资源

3️⃣ 基本写法

复制代码
@override
void dispose() {
  print('页面销毁');
  super.dispose();
}

📌 记住:

dispose 是善后工作


七、一个完整生命周期示例

复制代码
class LifeCycleDemo extends StatefulWidget {
  @override
  _LifeCycleDemoState createState() => _LifeCycleDemoState();
}

class _LifeCycleDemoState extends State<LifeCycleDemo> {
  int count = 0;

  @override
  void initState() {
    super.initState();
    print('initState');
  }

  @override
  Widget build(BuildContext context) {
    print('build');
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            setState(() {
              count++;
            });
          },
          child: Text('点击 $count'),
        ),
      ),
    );
  }

  @override
  void dispose() {
    print('dispose');
    super.dispose();
  }
}

运行后你会看到:

  • initState:只执行一次
  • build:多次执行
  • dispose:页面退出时执行

八、生命周期执行顺序(记住这个)

复制代码
initState
↓
build
↓
setState → build(多次)
↓
dispose

📌 这是 Flutter 状态组件的核心流程图


九、新手最常见的 5 个坑

❌ 在 build 里请求接口

❌ 在 initState 里用 context 做复杂操作

❌ 忘记调用 super

❌ 不释放资源

❌ 以为 build 只执行一次


十、这一篇你真正学会了什么?

你已经掌握了:

  • StatefulWidget 的生命周期
  • initState 的正确用途
  • build 的真正职责
  • dispose 的重要性

你现在对 Flutter 的理解已经是:

不是"写 UI",而是"管理状态与生命周期"


十一、总结一句话

initState 初始化
build 渲染界面
dispose 善后清理


🔜 下一篇预告

《Flutter 零基础入门(二十八):列表 ListView ------ 最常用的页面结构》

下一篇我们将正式进入:

  • ListView
  • 列表滚动
  • 列表项复用
  • 真实 App 的信息流结构

从下一篇开始:

你写的将不再是"单页面",而是"真实业务页面" 📱

相关推荐
C澒13 分钟前
前端整洁架构(Clean Architecture)实战解析:从理论到 Todo 项目落地
前端·架构·系统架构·前端框架
Anastasiozzzz14 分钟前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步18 分钟前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
C澒19 分钟前
Remesh 框架详解:基于 CQRS 的前端领域驱动设计方案
前端·架构·前端框架·状态模式
Charlie_lll23 分钟前
学习Three.js–雪花
前端·three.js
机器视觉的发动机30 分钟前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经38 分钟前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
onebyte8bits39 分钟前
前端国际化(i18n)体系设计与工程化落地
前端·国际化·i18n·工程化
R_.L1 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
C澒1 小时前
前端分层架构实战:DDD 与 Clean Architecture 在大型业务系统中的落地路径与项目实践
前端·架构·系统架构·前端框架