如何在Dart中动态获取枚举值并简化代码实现
解决Dart动态获取枚举values的问题
问题根源
你传递给getOptionsList的是枚举的Type对象(如TestOption2),而非枚举类型本身;同时dynamic类型无法识别枚举的静态values属性,导致调用option.values报错。另外你的TestOption2中存在重复的test3成员,这是Dart枚举不允许的,需先修正。
方案1:直接传递枚举values列表(简单直接)
修改函数参数,让调用者传入枚举的values列表,无需动态解析:
enum TestOption1 { test1("1"), test2("10"), test3("100"); final String text; const TestOption1(this.text); } enum TestOption2 { test1("2"), test2("20"), test3("200"), test4("2000"), // 修正重复的test3 test5("20000"), test6("200000"); final String text; const TestOption2(this.text); } void main() { const enumType = TestOption2; List<String>? optionsList; if (enumType == TestOption1 || enumType == TestOption2) { print("enter here"); // 传递对应枚举的values optionsList = getOptionsList( enumType == TestOption1 ? TestOption1.values : TestOption2.values, ["2", "200"] ); } print(optionsList); // 输出: [test1, test3] } List<String> getOptionsList<T extends Enum>(List<T> enumValues, List<String> testList) { try { return enumValues .where((e) => testList.contains((e as dynamic).text)) .map((e) => e.name) .toList(); } catch (e) { return []; } }
方案2:用接口+泛型实现类型安全处理(推荐)
定义统一接口让所有枚举实现,通过泛型约束实现类型安全的动态解析:
// 定义统一接口,规范枚举的text属性 abstract class TextEnum { String get text; } enum TestOption1 implements TextEnum { test1("1"), test2("10"), test3("100"); @override final String text; const TestOption1(this.text); } enum TestOption2 implements TextEnum { test1("2"), test2("20"), test3("200"), test4("2000"), // 修正重复成员 test5("20000"), test6("200000"); @override final String text; const TestOption2(this.text); } void main() { // 直接指定泛型参数即可 final optionsList = getOptionsList<TestOption2>(["2", "200"]); print(optionsList); // 输出: [test1, test3] } // 泛型约束:T必须是枚举且实现TextEnum List<String> getOptionsList<T extends Enum & TextEnum>(List<String> testList) { try { // 通过泛型类型获取枚举values final enumValues = (T as dynamic).values as List<T>; return enumValues .where((e) => testList.contains(e.text)) .map((e) => e.name) .toList(); } catch (e) { return []; } }
方案3:使用dart:mirrors反射(不推荐)
反射可以动态解析任意枚举类型,但会增加应用体积,且Flutter等环境可能受限:
import 'dart:mirrors'; enum TestOption1 { test1("1"), test2("10"), test3("100"); final String text; const TestOption1(this.text); } enum TestOption2 { test1("2"), test2("20"), test3("200"), test4("2000"), test5("20000"), test6("200000"); final String text; const TestOption2(this.text); } void main() { const enumType = TestOption2; final optionsList = getOptionsList(enumType, ["2", "200"]); print(optionsList); // 输出: [test1, test3] } List<String> getOptionsList(Type enumType, List<String> testList) { try { final classMirror = reflectType(enumType) as ClassMirror; final values = classMirror.getField(#values).reflectee as List<Enum>; return values .where((e) => testList.contains((e as dynamic).text)) .map((e) => e.name) .toList(); } catch (e) { return []; } }
内容的提问来源于stack exchange,提问作者Daniel Roldán
相关产品推荐
相关产品推荐

