Flutter / Dart 将整数转换为枚举类型

97

有没有一种简单的方法将整数值转换为枚举类型?我想从共享首选项中检索整数值并将其转换为枚举类型。

我的枚举类型是:

enum ThemeColor { red, gree, blue, orange, pink, white, black };

我想轻松将整数转换为枚举:

final prefs = await SharedPreferences.getInstance();
ThemeColor c = ThemeColor.convert(prefs.getInt('theme_color')); // something like that

你是如何在SharedPrefs中添加枚举类型的?能否给我一些指导? - Pawan
@Pawan,由于status是一个枚举类型,你可以使用status.index来获取整数值。 - maganap
5个回答

144
int idx = 2;
print(ThemeColor.values[idx]);

应该给你

ThemeColor.blue

31

您可以使用:

ThemeColor.red.index

应该给你

0

12
在Dart 2.17中,你可以使用带有值的增强枚举(这些值可能与索引不同)。确保根据需要使用正确的枚举。你还可以在枚举上定义自己的getter。
//returns Foo.one
print(Foo.values.firstWhere((x) => x.value == 1));
  
//returns Foo.two
print(Foo.values[1]);
  
//returns Foo.one
print(Foo.getByValue(1));

enum Foo {
  one(1),
  two(2);

  const Foo(this.value);
  final num value;
  
  static Foo getByValue(num i){
    return Foo.values.firstWhere((x) => x.value == i);
  }
}

2

警告:确保您使用try/catch处理不存在的整数。

/// Shows what to do when creating an enum value from a integer value

enum ThemeColor { red, green,}


void main() {
  
  try {
    final nonExistent = ThemeColor.values[3];
    print("Non existent enum is $nonExistent");

  }
  catch(e) {
    print("Non existent enum thrown"); 
  }
}

// Non existent enum thrown

Dartpad: https://dartpad.dev/?id=4e99d3f578311288842a0ab5e069797e

Dartpad是一个在线的Dart编辑器,它可以让你轻松地编写、运行和共享Dart代码。在Dartpad上,你可以快速测试Dart语言的各种功能和特性,而不需要安装任何软件或设置开发环境。


0

使用增强的枚举的另一种解决方案,以及:

  • 附加到枚举值的更多属性
  • 工厂构造函数
  • 构造函数中的回退值
  • 实现 Comparable 接口
  • 比较运算符的重载
  • 转换为映射

在 Dart 2.19.6 上进行了测试。

enum AuthLevel implements Comparable<AuthLevel> {
  guest(1, 'Guest'),
  user(2, 'Registered user'),
  admin(5, 'Administrator'),
  developer(9, 'Developer');

  final int level;
  final String desc;

  const AuthLevel(this.level, this.desc);

  // Conversion from int
  factory AuthLevel.fromInt(int level) =>
      values.firstWhere((value) => value.level == level, orElse: () => guest);

  // Conversion to int
  int get toInt => level;

  @override
  int compareTo(AuthLevel other) => level - other.level;

  // Comparison operator(s)
  bool operator >=(AuthLevel other) => level >= other.level;
  // ... possibly add more

  @override
  String toString() => '{level: $level, desc: $desc}';

  // Conversion to map
  Map<int, String> toMap() =>
      {for (var value in AuthLevel.values) value.level: value.desc};
}

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