Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步
文章目录
- [Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步](#Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步)
-
- 一、为什么需要枚举(enum)?
- 二、枚举(enum)是什么?
- [三、enum 的基本定义](#三、enum 的基本定义)
- [四、使用 enum 变量](#四、使用 enum 变量)
- [五、enum + if 判断](#五、enum + if 判断)
- [六、为什么 enum 非常适合"状态管理"?](#六、为什么 enum 非常适合“状态管理”?)
- [七、一个真实场景示例(非 UI)](#七、一个真实场景示例(非 UI))
- [八、enum 与 switch(推荐写法)](#八、enum 与 switch(推荐写法))
- [九、enum 是如何"帮你减少 Bug 的"?](#九、enum 是如何“帮你减少 Bug 的”?)
- [十、enum vs int / String 对比总结](#十、enum vs int / String 对比总结)
- [十一、enum 与 Class 的配合(重要思想)](#十一、enum 与 Class 的配合(重要思想))
- 十二、这一篇你真正学到的是什么?
- 十三、总结
- [🔜 下一篇预告](#🔜 下一篇预告)
在前面的学习中,我们已经解决了一个非常重要的问题:
👉 如何安全地表示"有没有值"(Null Safety)
但在真实开发中,还有另一类更常见的问题:
- 当前是加载中?
- 加载成功了?
- 还是加载失败?
- 页面现在处于哪种状态?
如果你用 String 或 int 来表示这些状态,代码会非常混乱、也非常不安全。
这一篇,我们来学习一个专门为"状态"而生的工具 :
👉 枚举(enum)
一、为什么需要枚举(enum)?
先来看一个"新手常见写法":
dart
String status = 'loading';
if (status == 'loading') {}
if (status == 'success') {}
if (status == 'error') {}
问题在哪里?
- 字符串容易拼错
- 没有提示
- 没有约束
- 编译器无法帮你发现错误
📌 Dart 无法阻止你写出:
status = 'loadding'; // ❌ 逻辑错误,但不会报错
二、枚举(enum)是什么?
枚举 = 一组有限、固定的取值
比如:
- 状态只能是「加载中 / 成功 / 失败」
- 性别只能是「男 / 女」
- 主题只能是「浅色 / 深色」
👉 这正是 enum 的用武之地。
三、enum 的基本定义
enum PageState {
loading,
success,
error,
}
这里的含义是:
- PageState 是一个新类型
- 它的取值 只能 是这三个之一
四、使用 enum 变量
PageState state = PageState.loading;
注意:
- 不能随便赋值
- 不能写成字符串
- 编译器会自动提示可选项
五、enum + if 判断
if (state == PageState.loading) {
print('加载中...');
} else if (state == PageState.success) {
print('加载成功');
} else {
print('加载失败');
}
📌 对比 String 写法:
- 更安全
- 不可能写错
- IDE 自动补全
六、为什么 enum 非常适合"状态管理"?
在 Flutter 中,页面本质上就是状态的不同表现:
- loading → 显示 loading
- success → 显示内容
- error → 显示错误页
而 enum:
- 天然适合描述"状态"
- 状态是有限的
- 状态是可穷举的
七、一个真实场景示例(非 UI)
enum LoadState {
idle,
loading,
success,
error,
}
void handleState(LoadState state) {
if (state == LoadState.idle) {
print('初始状态');
} else if (state == LoadState.loading) {
print('请求中');
} else if (state == LoadState.success) {
print('请求成功');
} else {
print('请求失败');
}
}
📌 这已经是 Flutter 状态管理的雏形
八、enum 与 switch(推荐写法)
当你用 enum 判断时,switch 比 if 更优雅:
switch (state) {
case PageState.loading:
print('加载中');
break;
case PageState.success:
print('成功');
break;
case PageState.error:
print('失败');
break;
}
优势:
- 所有状态一目了然
- 漏写会被编译器提示
- 更适合状态逻辑
九、enum 是如何"帮你减少 Bug 的"?
假设你后来新增了一个状态:
enum PageState {
loading,
success,
empty,
error,
}
如果你忘了在 switch 中处理 empty:
👉 编译器会警告你
这在大型项目中非常重要。
十、enum vs int / String 对比总结
| 方式 | 是否安全 | 是否可控 | 是否推荐 |
|---|---|---|---|
| String | ❌ | ❌ | 不推荐 |
| int | ❌ | ❌ | 不推荐 |
| enum | ✅ | ✅ | 强烈推荐 |
📌 一句话结论:
只要是"有限状态",优先使用 enum
十一、enum 与 Class 的配合(重要思想)
enum UserType {
normal,
vip,
admin,
}
class User {
final String name;
final UserType type;
User(this.name, this.type);
}
现在:
- 用户类型不再混乱
- 数据模型更加严谨
- 逻辑更清晰
十二、这一篇你真正学到的是什么?
你不仅学了 enum 语法,更重要的是:
- 学会了用类型表达业务含义
- 开始用"状态"思维写代码
- 为 Flutter 的 UI 切换打基础
📌 这是从"写代码"到"设计代码"的转变。
十三、总结
本篇你已经掌握:
- enum 的定义与使用
- enum 与 if / switch
- enum 在状态管理中的作用
- 为什么 enum 是 Flutter 的必备工具
🔜 下一篇预告
《Flutter 零基础入门(十三):late 关键字与延迟初始化》
下一篇我们将学习:
- late 是为了解决什么问题
- late 与 final 的关系
- 常见使用场景
- Flutter 中为什么大量使用 late
你将进一步理解:
Dart 是如何在"安全"和"灵活"之间取得平衡的