
在上一篇中,我们已经正式进入 Flutter,并完成了:
但你一定会产生一个疑问:
👉 如果页面内容要变化怎么办? 👉 按钮点击后,文字如何改变?
这一篇,我们来解决 Flutter 中最核心的问题: 👉 状态(State)从哪里来?
先回顾 StatelessWidget:
class MyWidget extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Text('Hello');
}
}
特点非常明确:
📌 所以:
StatelessWidget 天生不适合“会变的 UI”
在 Flutter 中,状态指的是:
影响 UI 显示的数据
例如:
📌 一句话理解:
状态变了,UI 就该变
class Counter extends StatelessWidget {
int count = 0;
@override
Widget build(BuildContext context) {
return Text('$count');
}
}
你可能会想:
改
count不就行了吗?
❌ 这是行不通的。
原因是:
为了解决“UI 需要变化”的问题,Flutter 引入了:
👉 StatefulWidget
它的核心思想是:
Widget 负责描述 UI State 负责保存和管理状态
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');
}
}
📌 注意:
这是 Flutter 的设计核心:
好处:
仅仅修改变量是不够的:
count++;
你必须告诉 Flutter:
状态变了,需要重新 build
这就是 setState 的作用。
setState(() {
count++;
});
含义是:
📌 本质:
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'),
),
],
);
}
}
流程非常重要:
1️⃣ 用户点击按钮 2️⃣ 调用 setState 3️⃣ Flutter 标记当前 State 为“脏” 4️⃣ build 重新执行 5️⃣ UI 更新
📌 你不需要手动操作 UI。
StatefulWidget(不可变)
↓
State(可变)
↓
build()
↓
UI
这张图,你以后会反复用到。
❌ 在 build 中写逻辑 ❌ 忘记使用 setState ❌ 把状态写在 StatelessWidget 中
记住一句话:
状态只存在于 State 中
你已经理解了 Flutter 的核心哲学:
UI 是状态的映射结果
这也是 Flutter、React、Vue 的共同思想。
本篇你学会了:
你已经正式跨入:
Flutter 状态驱动 UI 的世界
《Flutter 零基础入门(十八):StatefulWidget 生命周期初识》
下一篇我们将学习:
从下一篇开始:
你将真正理解 Flutter 页面“从出生到销毁”的全过程