36.Flutter 零基础入门(三十六):StatefulWidget 与 setState 进阶 —— 动态页面必学

Flutter 零基础入门(三十六):StatefulWidget 与 setState 进阶 ------ 动态页面必学

到目前为止,你已经会了:

  • 页面跳转(Navigator)
  • 用户输入与表单(TextField / Form)
  • 异步操作(Future / async / await)

但是所有真实 App 都是动态的页面

  • 点击按钮改变状态
  • 异步加载数据刷新界面
  • 计数器、点赞、收藏功能

这些功能的核心就是 StatefulWidget + setState


一、StatefulWidget 与 StatelessWidget 区别

类型 特点 使用场景
StatelessWidget 无状态,UI 一旦生成就固定 静态页面、文本展示、图标
StatefulWidget 有状态,可动态刷新 UI 交互、表单、列表更新

📌 记住:

只要 UI 会变化,一定是 StatefulWidget


二、StatefulWidget 基本写法

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

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('计数器')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('点击次数: $_count', style: TextStyle(fontSize: 24)),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _count++;
                });
              },
              child: Text('点击增加'),
            ),
          ],
        ),
      ),
    );
  }
}

📌 关键点:

  • _count → 状态变量
  • setState(() { ... }) → 更新状态并刷新 UI

三、setState 的工作原理

1️⃣ 你修改了状态变量

2️⃣ 调用 setState

3️⃣ Flutter 框架会重新调用 build 方法

4️⃣ UI 根据新的状态重新渲染

📌 注意:

修改状态变量必须在 setState 内,或者在异步完成后调用 setState


四、异步更新状态示例

结合上一章 Future / async / await:

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

class _AsyncCounterState extends State<AsyncCounter> {
  int _count = 0;

  Future<void> incrementLater() async {
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('异步计数器')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('点击次数: $_count', style: TextStyle(fontSize: 24)),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: incrementLater,
              child: Text('2 秒后增加'),
            ),
          ],
        ),
      ),
    );
  }
}

📌 注意:

  • 异步操作结束后 必须用 setState 刷新 UI
  • 否则界面不会更新

五、多个状态变量的更新

复制代码
int _count = 0;
bool _isLoading = false;

void handleClick() {
  setState(() {
    _count++;
    _isLoading = true;
  });
}

✅ setState 可以同时更新多个状态变量


六、StatefulWidget 常见坑

❌ 在 build 内直接修改状态 → 无限刷新

❌ 忘记调用 setState → UI 不刷新

❌ 异步更新状态不在 setState → UI 不刷新

❌ 创建过多 StatefulWidget → 性能问题

📌 建议:

  • 状态变量尽量封装在 State 类内
  • setState 只包裹修改变量的部分

七、StatefulWidget 与 TextField / ListView 结合

  • 输入框:用户输入 → 状态变量保存 → UI 刷新
  • 列表:添加 / 删除 / 修改数据 → setState 刷新 ListView / GridView

📌 基本模式:

复制代码
状态变量 (State) → build 渲染 UI → 用户操作 / 异步修改状态 → setState → 重新渲染

八、本篇你真正掌握了什么?

你已经学会:

  • StatefulWidget 基本结构
  • setState 刷新 UI 原理
  • 异步操作更新状态
  • 多状态变量更新
  • 与列表、输入框结合的动态 UI

📌 到这里为止:

你已经能写出完整的动态交互页面了 🎉


九、一句话总结

StatelessWidget 展示静态
StatefulWidget + setState 控制动态
异步操作也要用 setState 刷新 UI


🔜 下一篇预告

《Flutter 零基础入门(三十七):SnackBar 与提示信息 ------ 页面反馈与用户交互必学》

下一篇我们将学习:

  • SnackBar 提示
  • AlertDialog 弹窗
  • 用户操作后的即时反馈

🚀 动态交互能力再升级

相关推荐
小徐_233313 分钟前
uni-app 组件库 Wot UI 2.0 发布了,我们带来了这些改变!
前端·微信小程序·uni-app
Johnstons15 分钟前
网络可观测性落地指南:从“出了问题才排查“到“实时感知全网状态“
开发语言·网络·php
❀͜͡傀儡师18 分钟前
Claude Code 官方弃用 npm 安装方式:原因分析与完整迁移指南
前端·npm·node.js·claude code
️是7821 分钟前
信息奥赛一本通—编程启蒙(3371:【例64.2】 生日相同)
开发语言·c++·算法
Kiling_070422 分钟前
Java Math类核心用法全解析
java·开发语言
知识分享小能手23 分钟前
ECharts入门学习教程,从入门到精通,ECharts高级功能(6)
前端·学习·echarts
阿祖zu23 分钟前
OpenClaw 入门到放弃:私人 AI 的初代原型机
前端·后端·aigc
ZC跨境爬虫24 分钟前
3D地球卫星轨道可视化平台开发 Day15(添加卫星系列模糊搜索功能)
前端·数据库·3d·交互·数据可视化
jieyucx25 分钟前
Go 语言运算符与控制台输入输出详解
开发语言·后端·golang
Ulyanov33 分钟前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio的定位革命与技术架构
开发语言·python·qt·系统仿真·雷达电子对抗仿真