Dart:枚举

  1. 基本概念
  2. 定义枚举
    1. 普通枚举(无值)
    2. 增强枚举(带值)
    3. 枚举的常用方法和属性

基本概念

枚举(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

×

喜欢就点赞,疼爱就打赏