Flutter 零基础入门(二十六):StatefulWidget 与状态更新 setState

Flutter 零基础入门(二十六):StatefulWidget 与状态更新 setState

在前面的学习中,我们已经掌握了:

  • 布局(Row / Column / Expanded)
  • 样式(Container / Text)
  • 图片与图标
  • 按钮与手势(Button / InkWell)

但你可能已经发现一个问题:

页面是"死的"

点了按钮,界面并不会发生变化

这一篇,我们正式解决这个问题。


一、什么是"状态(State)"?

在 Flutter 中:

状态 = 会发生变化的数据

例如:

  • 计数器的数字
  • 是否已点赞
  • 是否登录
  • 是否选中

📌 一句话理解:

只要会变,就是状态


二、StatelessWidget 的局限性

你之前写的页面,大多是:

dart 复制代码
class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text('Hello');
  }
}

特点:

  • 没有状态
  • 一旦构建完成,内容就不会变

👉 StatelessWidget 适合"静态页面"


三、StatefulWidget:可变页面的核心

1️⃣ 什么是 StatefulWidget?

StatefulWidget 是:

可以拥有状态,并且状态变化后可以刷新 UI 的 Widget


2️⃣ 基本结构(一定要记住)

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

class _MyPageState extends State<MyPage> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

📌 记忆重点:

  • Widget 本身不变
  • State 才是真正"活的"

四、State 中存放状态变量

复制代码
class _MyPageState extends State<MyPage> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Text('当前数量:$count');
  }
}

这里:

  • count 就是状态
  • UI 依赖状态显示

五、setState:刷新界面的关键(重点)

1️⃣ setState 是什么?

复制代码
setState(() {
  count++;
});

作用只有一个:

告诉 Flutter:状态变了,请重新 build


2️⃣ 没有 setState 会怎样?

复制代码
count++;
  • 数据变了
  • 界面不会更新

📌 这是新手最常见的坑。


六、第一个完整示例:计数器

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

class _CounterPageState extends State<CounterPage> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              '当前值:$count',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 12),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  count++;
                });
              },
              child: Text('加 1'),
            ),
          ],
        ),
      ),
    );
  }
}

📌 这是 Flutter 官方示例的简化版。


七、setState 的正确使用原则

✅ 应该做的

复制代码
setState(() {
  count++;
});

❌ 不应该做的

复制代码
setState(() {
  doNetworkRequest();
});

📌 原则:

setState 里只放"状态修改"


八、State 的生命周期(简单了解)

State 会经历:

1️⃣ 创建

2️⃣ build

3️⃣ 多次 setState → build

4️⃣ 销毁

你现在只需要记住一句话:

build 会被反复调用


九、常见状态场景示例

1️⃣ 点赞 / 取消点赞

复制代码
bool liked = false;

IconButton(
  icon: Icon(
    liked ? Icons.favorite : Icons.favorite_border,
    color: liked ? Colors.red : Colors.grey,
  ),
  onPressed: () {
    setState(() {
      liked = !liked;
    });
  },
)

2️⃣ 显示 / 隐藏内容

复制代码
bool show = true;

if (show) Text('我是内容');

十、新手常见误区总结

❌ 忘记用 StatefulWidget

❌ 修改状态却不调用 setState

❌ 把所有代码都写进 setState

❌ 不理解 build 会多次执行

📌 一句话避坑:

数据变 → setState → 重新 build


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

你已经掌握了:

  • 什么是状态(State)
  • StatelessWidget vs StatefulWidget
  • setState 的真正作用
  • 点击后更新界面的完整流程

从这一刻起:

你的 Flutter App 真正"活"了


十二、总结

本篇你学会了:

  • Flutter 的状态基础模型
  • 动态 UI 的核心机制
  • 最重要的 setState 用法

🔜 下一篇预告

《Flutter 零基础入门(二十七):Widget 生命周期(initState / dispose)》

下一篇我们将学习:

  • initState 是干嘛的?
  • dispose 什么时候调用?
  • 资源释放的重要性
  • 页面初始化的正确姿势

从下一篇开始:

你将真正"掌控 Widget 的一生" 🧠

相关推荐
m0_748229992 小时前
Laravel8.X核心功能全解析
开发语言·数据库·php
秋秋小事2 小时前
TypeScript 模版字面量与类型操作
前端·typescript
qq_192779872 小时前
C++模块化编程指南
开发语言·c++·算法
2401_892000522 小时前
Flutter for OpenHarmony 猫咪管家App实战 - 添加提醒实现
前端·javascript·flutter
Yolanda943 小时前
【项目经验】vue h5移动端禁止缩放
前端·javascript·vue.js
时光慢煮3 小时前
【Flutter × OpenHarmony】跨端开发实现全局Toast提示卡片
flutter·华为·开源·openharmony
代码村新手3 小时前
C++-String
开发语言·c++
IT陈图图3 小时前
Flutter × OpenHarmony 混合布局实战:在一个容器中优雅组合列表与网格
flutter·鸿蒙·openharmony
qq_401700413 小时前
Qt 中文乱码的根源:QString::fromLocal8Bit 和 fromUtf8 区别在哪?
开发语言·qt