You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart中运行时获取任意Enum的所有枚举值?

解决Dart中动态获取任意枚举所有值的问题

要实现通用的枚举值遍历逻辑,你可以利用Dart的反射机制来动态获取任意枚举类型的所有values,具体代码修改如下:

import 'dart:mirrors';

enum ABC {a, b, c}

enum ThreeNumbers {one, two, three}

void main() {
  print('----');
  FancyPrint(ABC.a);
  print('----');
  FancyPrint(ThreeNumbers.two);
  print('----');
}

class FancyPrint{
  Enum input;
  
  FancyPrint(this.input){
    // 获取当前枚举类型的镜像对象
    final enumMirror = reflectType(input.runtimeType) as ClassMirror;
    // 提取枚举的所有值集合
    final enumValues = enumMirror.getField(#values).reflectee as List<Enum>;
    
    for(final v in enumValues){
      print('${v == input ? 'x' : '-'} $v');
    }
  }
}

代码说明:

  • 导入dart:mirrors包:这是Dart提供的运行时反射工具,用于获取类型的元数据信息。
  • 获取枚举类型镜像:通过input.runtimeType拿到当前枚举的具体类型,再用reflectType将其转为ClassMirror,以此访问枚举的静态属性。
  • 提取values集合:所有Dart枚举默认自带静态属性values,存储了该枚举的所有实例。通过getField(#values)可以动态获取这个属性,再转为List<Enum>类型进行遍历。

注意事项:

如果是Flutter项目,由于AOT编译的限制,官方默认禁用了反射功能,此时可以考虑使用代码生成工具(如build_runner配合自定义生成器),或者给枚举添加统一的扩展方法来暴露values。不过纯Dart项目中,上述反射方案可以完美适配所有枚举类型。

内容的提问来源于stack exchange,提问作者Stephan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:46:15