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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:58