如何在Dart中循环枚举?

20

我在我的Flutter项目中有一个Dart枚举类型,就像这样:

enum RepeatState {
  playSongOnce,
  repeatSong,
  repeatPlaylist,
}

如果我有一个随机的枚举状态,例如RepeatState.repeatSong,如何迭代到下一个枚举(而不是使用switch语句来映射它们)?

这里这里这里的帮助下,我找到了答案,并在下面发布。

3个回答

51

假设有一个如下所示的枚举:

enum MyEnum {
  horse,
  cow,
  camel,
  sheep,
  goat,
}

循环枚举值

您可以使用values属性遍历枚举的值:

for (var value in MyEnum.values) {
  print(value);
}

// MyEnum.horse
// MyEnum.cow
// MyEnum.camel
// MyEnum.sheep
// MyEnum.goat

在值和其索引之间进行转换

每个值都有一个索引:

int index = MyEnum.horse.index; // 0

你可以使用下标符号将索引转换回枚举:

MyEnum value = MyEnum.values[0]; // MyEnum.horse

寻找下一个枚举值

结合这些事实,您可以循环枚举的值来查找下一个值,如下所示:

MyEnum nextEnum(MyEnum value) {
  final nextIndex = (value.index + 1) % MyEnum.values.length;
  return MyEnum.values[nextIndex];
}

使用模运算符处理即使在枚举值列表的末尾处也可以处理索引:

MyEnum nextValue = nextEnum(MyEnum.goat); // MyEnum.horse

8
enum Fruites { Mango, Banana, Cherry, Avacado, Papaya }

void main() {
  Fruites.values.forEach((name) {
    print(name);
  });
}

输出:

Fruites.Mango
Fruites.Banana
Fruites.Cherry
Fruites.Avacado
Fruites.Papaya

仅取名称部分

print(name.toString().split('.').elementAt(1));

输出:

Mango
Banana
Cherry
Avacado
Papaya

3

使用Flutter 3.0中的枚举,您可以拥有额外的函数来获取所有枚举值或通过字符串值获取一个枚举值,例如:

enum RepeatState {
  playSongOnce,
  repeatSong,
  repeatPlaylist;

  static RepeatState getEnum(String name) => RepeatState.values.firstWhere((element) => element.name == name);
  static List<String> stringValues() => RepeatState.values.map((e) => e.name).toList();
}

为了获取字符串值:StatusEnum.purple.value 并调用我们的额外函数:
print('${RepeatState.stringValues()}');
print('${RepeatState.getEnum('repeatSong')}');

给我们:
I/flutter (14298): [playSongOnce, repeatSong, repeatPlaylist]
I/flutter (14298): RepeatState.repeatSong

关于新枚举的更多信息请参见此处


那么如何循环遍历值呢?例如,你能否拥有一个RepeatState.next的获取器(getter)呢? - Suragch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接