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

从下一篇开始:

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

相关推荐
子春一3 小时前
Flutter for OpenHarmony:构建一个高精度 Flutter 计时器:深入解析 Timer、状态同步与 UI 响应式设计
flutter·ui
雨季6664 小时前
构建 OpenHarmony 简易文字行数统计器:用字符串分割实现纯文本结构感知
开发语言·前端·javascript·flutter·ui·dart
雨季6664 小时前
Flutter 三端应用实战:OpenHarmony 简易倒序文本查看器开发指南
开发语言·javascript·flutter·ui
九 龙4 小时前
Flutter框架跨平台鸿蒙开发——水电缴费提醒APP的开发流程
flutter·华为·harmonyos·鸿蒙
小北方城市网4 小时前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf
进击的小头4 小时前
行为型模式:策略模式的C语言实战指南
c语言·开发语言·策略模式
console.log('npc')4 小时前
vue2 使用高德接口查询天气
前端·vue.js
2401_892000524 小时前
Flutter for OpenHarmony 猫咪管家App实战 - 添加支出实现
前端·javascript·flutter
天马37984 小时前
Canvas 倾斜矩形绘制波浪效果
开发语言·前端·javascript
天天向上10244 小时前
vue3 实现el-table 部分行不让勾选
前端·javascript·vue.js