如何在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
相关产品推荐
相关产品推荐

