基本概念
枚举(enum) 是一组有限且固定的常量集合,通常用来表示状态、方向、选项等。它能让代码更易读、更安全,避免用魔法数字或字符串来表示状态。
定义枚举
普通枚举(无值)
enum RequestState {
loading,
success,
error;
// 工厂方法:从数字转换为枚举
factory RequestState.fromCode(int code) {
switch (code) {
case 0:
return RequestState.loading;
case 1:
return RequestState.success;
case 2:
return RequestState.error;
default:
throw ArgumentError("未知状态码: $code");
}
}
}
void main() {
// 模拟后端返回数字
int backendCode = 1; // 表示成功
RequestState state = RequestState.fromCode(backendCode);
print("当前状态: $state"); // 输出: RequestState.success
}
增强枚举(带值)
在 Dart 里,“增强枚举”(enhanced enum,也叫带值枚举)是 Dart 2.17 引入的特性,它让枚举像类一样,可以有:
- 字段(属性)
- 构造函数
- 方法
- 实现接口
这就比传统的“无值枚举”更灵活,能直接绑定额外数据,而不是另写一个 Map 去映射。
enum RequestState {
loading(0, '正在加载'),
success(1, '请求成功'),
error(2, '请求失败');
final int code; // 数值标识
final String message; // 描述文本
const RequestState(this.code, this.message);
// 工厂方法:通过 code 找枚举
static RequestState fromCode(int code) {
// 通过状态码找到对应的枚举值
// RequestState.values 是一个包含所有枚举值的列表,数据类型是 List<RequestState>
// firstWhere 方法会遍历这个列表,找到第一个满足条件的枚举
return RequestState.values.firstWhere(
(e) => e.code == code, // 条件:枚举的 code 等于传入的 code
orElse: () => RequestState.error, // 如果没有找到,返回 RequestState.error
);
}
}
void main() {
// 假设后端返回了一个状态码:1
var state = RequestState.fromCode(1);
print(state); // RequestState.success
print(state.message); // 请求成功
}
枚举的常用方法和属性
enum Color {
red,
green,
blue
}
void main() {
// 1. values → 所有枚举成员的列表
print(Color.values); // [Color.red, Color.green, Color.blue]
print(Color.values.length); // 3
// 2. index → 枚举的索引(从 0 开始)
print(Color.red.index); // 0
print(Color.green.index); // 1
// 3. name(Dart 2.15+)→ 枚举成员的名字字符串
print(Color.blue.name); // blue
// 4. 遍历枚举
for (var c in Color.values) {
print('${c.index}: ${c.name}');
}
// 输出:
// 0: red
// 1: green
// 2: blue
// 5. 使用枚举判断
var myColor = Color.green;
if (myColor == Color.green) {
print("It's green!");
}
// 6. 根据索引获取枚举(自定义)
var byIndex = Color.values[2];
print(byIndex); // Color.blue
}
属性/方法 | 作用 | 示例 |
---|---|---|
values |
获取枚举的所有成员列表 | Color.values |
index |
获取成员的索引(从 0 开始) | Color.red.index |
name |
获取成员的名字(字符串) | Color.blue.name |
toString() |
返回带枚举类型前缀的字符串 | Color.green.toString() → "Color.green" |
遍历枚举 | 遍历所有枚举成员 | for (var e in Color.values) {} |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com