17.Flutter 零基础入门(十七):StatelessWidget 与 State 的第一次分离

Flutter 零基础入门(十七):StatelessWidget 与 State 的第一次分离

在上一篇中,我们已经正式进入 Flutter,并完成了:

  • 第一个 Flutter 页面
  • Widget 树的理解
  • StatelessWidget 与 build 方法

但你一定会产生一个疑问:

👉 如果页面内容要变化怎么办?

👉 按钮点击后,文字如何改变?

这一篇,我们来解决 Flutter 中最核心的问题

👉 状态(State)从哪里来?


一、StatelessWidget 的边界

先回顾 StatelessWidget:

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

特点非常明确:

  • 没有状态
  • 内容固定
  • 一旦创建,不会变化

📌 所以:

StatelessWidget 天生不适合"会变的 UI"


二、什么是 State(状态)?

在 Flutter 中,状态指的是:

影响 UI 显示的数据

例如:

  • 计数器的数字
  • 是否登录
  • 是否加载中
  • 当前选中项

📌 一句话理解:

状态变了,UI 就该变


三、一个"错误但常见"的新手尝试

复制代码
class Counter extends StatelessWidget {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Text('$count');
  }
}

你可能会想:

count 不就行了吗?

❌ 这是行不通的。

原因是:

  • StatelessWidget 不会监听变量变化
  • Flutter 不会重新 build

四、StatefulWidget 的出现

为了解决"UI 需要变化"的问题,Flutter 引入了:

👉 StatefulWidget

它的核心思想是:

Widget 负责描述 UI
State 负责保存和管理状态


五、StatefulWidget 的基本结构

复制代码
class Counter extends StatefulWidget {
  @override
  State<Counter> createState() {
    return _CounterState();
  }
}

对应的 State:

复制代码
class _CounterState extends State<Counter> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Text('$count');
  }
}

📌 注意:

  • Widget 和 State 是两个类
  • State 才是真正"活着的部分"

六、为什么要拆成两个类?

这是 Flutter 的设计核心

  • Widget:不可变(immutable)
  • State:可变(mutable)

好处:

  • UI 描述稳定
  • 状态变化可控
  • Flutter 可以高效更新界面

七、setState:状态变化的"开关"

仅仅修改变量是不够的

复制代码
count++;

你必须告诉 Flutter:

状态变了,需要重新 build

这就是 setState 的作用。


八、setState 的正确用法

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

含义是:

  • 在回调中修改状态
  • Flutter 重新调用 build

📌 本质:

setState = 通知 Flutter 刷新 UI


九、一个完整的计数器示例

复制代码
class Counter extends StatefulWidget {
  @override
  State<Counter> createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('当前计数:$count'),
        ElevatedButton(
          onPressed: () {
            setState(() {
              count++;
            });
          },
          child: Text('加 1'),
        ),
      ],
    );
  }
}

十、State 是如何驱动 UI 的?

流程非常重要:

1️⃣ 用户点击按钮

2️⃣ 调用 setState

3️⃣ Flutter 标记当前 State 为"脏"

4️⃣ build 重新执行

5️⃣ UI 更新

📌 你不需要手动操作 UI。


十一、Widget、State、build 的关系图

复制代码
StatefulWidget(不可变)
        ↓
     State(可变)
        ↓
     build()
        ↓
       UI

这张图,你以后会反复用到。


十二、新手最容易犯的错误

❌ 在 build 中写逻辑

❌ 忘记使用 setState

❌ 把状态写在 StatelessWidget 中

记住一句话:

状态只存在于 State 中


十三、这一篇你真正理解了什么?

你已经理解了 Flutter 的核心哲学:

UI 是状态的映射结果

这也是 Flutter、React、Vue 的共同思想。


十四、总结

本篇你学会了:

  • StatelessWidget 的边界
  • 什么是 State
  • StatefulWidget 的结构
  • setState 的作用

你已经正式跨入:

Flutter 状态驱动 UI 的世界


🔜 下一篇预告

《Flutter 零基础入门(十八):StatefulWidget 生命周期初识》

下一篇我们将学习:

  • initState 是什么时候执行的?
  • dispose 是干什么的?
  • State 的生命周期顺序
  • 为什么要释放资源?

从下一篇开始:

你将真正理解 Flutter 页面"从出生到销毁"的全过程

相关推荐
林古3 分钟前
我在 WSL 里控制 Windows Chrome 的一次实战复盘(OpenClaw)
前端
小蜜蜂嗡嗡18 分钟前
flutter实现付费解锁内容的遮挡
android·flutter
csdn_zhangchunfeng21 分钟前
Qt之slots和Q_SLOTS的区别
开发语言·qt
计算机安禾22 分钟前
【C语言程序设计】第35篇:文件的打开、关闭与读写操作
c语言·开发语言·c++·vscode·算法·visual studio code·visual studio
想不到一个好的ID22 分钟前
Claude Code 初学者必看指南
前端·后端
一枚菜鸟_24 分钟前
04-Flutter状态管理终极指南-Riverpod3.x从入门到精通
前端
一枚菜鸟_28 分钟前
06-Flutter动画从零到炫酷-让你的App动起来
前端
Wect31 分钟前
React Hooks 核心原理
前端·算法·typescript
shughui34 分钟前
Fiddler下载、安装、使用、汉化,详细图文教程(2026附安装包)
前端·测试工具·fiddler
kishu_iOS&AI35 分钟前
Python - 链表浅析
开发语言·python·链表