Flutter / Dart将Int转换为Enum

vfwfrxfs  于 2023-09-28  发布在  Flutter
关注(0)|答案(5)|浏览(304)

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

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

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

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

nhaq1z211#

在Dart 2.17中,您可以使用带值的增强枚举(它可能与索引具有不同的值)。请确保您使用正确的一个为您的需要。你也可以在你的枚举上定义你自己的getter。

  1. //returns Foo.one
  2. print(Foo.values.firstWhere((x) => x.value == 1));
  3. //returns Foo.two
  4. print(Foo.values[1]);
  5. //returns Foo.one
  6. print(Foo.getByValue(1));
  7. enum Foo {
  8. one(1),
  9. two(2);
  10. const Foo(this.value);
  11. final num value;
  12. static Foo getByValue(num i){
  13. return Foo.values.firstWhere((x) => x.value == i);
  14. }
  15. }
展开查看全部
gijlo24d

gijlo24d2#

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

  1. /// Shows what to do when creating an enum value from a integer value
  2. enum ThemeColor { red, green,}
  3. void main() {
  4. try {
  5. final nonExistent = ThemeColor.values[3];
  6. print("Non existent enum is $nonExistent");
  7. }
  8. catch(e) {
  9. print("Non existent enum thrown");
  10. }
  11. }
  12. // Non existent enum thrown

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

展开查看全部
8dtrkrch

8dtrkrch3#

另一个具有增强枚举的解决方案,加上:

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

在Dart 2.19.6上测试。

  1. enum AuthLevel implements Comparable<AuthLevel> {
  2. guest(1, 'Guest'),
  3. user(2, 'Registered user'),
  4. admin(5, 'Administrator'),
  5. developer(9, 'Developer');
  6. final int level;
  7. final String desc;
  8. const AuthLevel(this.level, this.desc);
  9. // Conversion from int
  10. factory AuthLevel.fromInt(int level) =>
  11. values.firstWhere((value) => value.level == level, orElse: () => guest);
  12. // Conversion to int
  13. int get toInt => level;
  14. @override
  15. int compareTo(AuthLevel other) => level - other.level;
  16. // Comparison operator(s)
  17. bool operator >=(AuthLevel other) => level >= other.level;
  18. // ... possibly add more
  19. @override
  20. String toString() => '{level: $level, desc: $desc}';
  21. // Conversion to map
  22. Map<int, String> toMap() =>
  23. {for (var value in AuthLevel.values) value.level: value.desc};
  24. }
展开查看全部
92dk7w1h

92dk7w1h4#

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

应该给予你

  1. ThemeColor.blue
xzabzqsa

xzabzqsa5#

您可以用途:

  1. ThemeColor.red.index

应该给予你

  1. 0

相关问题