Dart 枚举原始值指定问题 及 原始值与枚举值转换问题

问题由来

最近在看尝试Flutter,在开发时打算用枚举标示5个常用的按键KeyCode,因为就值关系特定几个KeyCode,所以打算仅设定5个枚举值,并且指定其原始值为其int值。但是我发现没办法指定这个int值。

一、原始值指定

Dart语言的枚举不支持指定原始值,比如下面这种方式:

enum Color {
  Red = 3,   // Error
  Green = 6, // Error

这样一来,如果想使枚举值有一个比较大的原始值,就只能使用本文件中KeyCode这种方式。一般如下:

enum Color {
  Red,    // 0
  Green,  // 1
  Blue,   // 2
  ...     // 从3到32都需要填满
  Brown,  // 33
  ...     // 从34到43都需要填满
  Pink,   // 44

但是如果我只想用Brown到Pink颜色这几种颜色,并且其原始值在100以上呢?比如键盘KeyCode☹️就有好多。

二、原始值与枚举值转换

另外Dart语言枚举值到原始值的转换,直接取其index即可:

Color.Green.index == 1 // true

但却不支持从int原始值转换为枚举值,比如下面这种方式:

enum Color {
  Red,    // 0
  Green,  // 1
  Blue,   // 2
// 疯狂实验中
Color red = Color(0);        // Error
Color red = (Color)0;        // Error
Color red = new Color(0);    // Error
Color red = const Color(0);  // Error

但enum提供了一个values属性,比如上面枚举有:

Color.values = List<Color>[Color.Red, ... , Color.Blue]

Color.values是一个有序数组,其下标和该位置的Color枚举值的原始值相等。
所以,如果一个枚举满足:1. 从零开始,2. 各个值密集排布,(Dart肯定满足,因为没办法指定原始值),