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 的信息流结构

从下一篇开始:

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

相关推荐
badhope4 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园5 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
hpoenixf5 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特6 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
C++ 老炮儿的技术栈6 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl6 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
泯泷6 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
Liu628886 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手6 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星6 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘