Flutter 學習之十一 enum(枚舉)好用的寫法

我猜不同的笑點,代表不同的智力水平。

前言

今年四月初寫Flutter的時候,覺得里面的枚舉著實有點難受,先不說Swift了,和oc相比都差太多,最起碼oc能賦值。不知怎的剛才突發奇想,仔細研究一下Flutter枚舉,沒想到還有真有好用的寫法。

正文

如果枚舉值對應的值是從0開始遞增的,那就太好了,直接下面寫就行了。

enum RoomType {
  /// 游戲
  game,

  /// 歌廳
  song,

  /// 直播
  live,
}

使用的時候直接用對應的index就ok,例:

int roomType = RoomType.song.index;   /// 值為1

但是,如果枚舉的值不是從0開始的怎么辦?如果枚舉值對應的是字符串呢?沒關系,寫擴展。

  • 枚舉擴展

extension RoomTypeValue on RoomType {
  String get value {
    String _value = '';
    switch (this) {
      case RoomType.game:
        _value = '1';
        break;
      case RoomType.song:
        _value = '3';
        break;
      case RoomType.live:
        _value = '5';
        break;
      default:
    }
    return _value;
  }
}

使用:

String roomType = RoomType.song.value;  /// 值為 '3'

可以看出,如果想對應其他的整型的值,就再寫一個get方法,然后再用switch case即可,對于前期學習的我就湊合著用了,但內心還是覺得這種寫法有點丑陋。

萬幸的是,隨著 2022 年 5 月在 Google I/O上發布Flutter 3.0,我們不必再依賴這些令人長長的代碼了。來看一下用最新寫法替代上面的擴展吧。

  • 枚舉新寫法

enum RoomType {
  /// 游戲
  game('1'),

  /// 歌廳
  song('3'),

  /// 直播
  live('5');

  final String value;
  const RoomType(this.value);
}

使用:

String roomType = RoomType.song.value;  /// 值為 '3'

簡潔!好用!
有的小伙伴會說,如果還對應整型值呢?沒關系,往下看:

enum RoomType {
  /// 游戲
  game('1', 1),

  /// 歌廳
  song('3', 3),

  /// 直播
  live('5', 5);

  final String value;
  final int number;
  const RoomType(this.value, this.number);
}

使用:

String roomType = RoomType.song.value;  /// 值為 '3'
int roomType = RoomType.song.number;  /// 值為 3

由此可見,想映射啥就映射啥,想映射幾個就映射幾個,有種鳥槍換炮的感覺,恐怖如斯。

后記

我查閱的資料的說的是3.0以后可以使用,我用的Dart版本是3.0.5,但是實測只要是2.17.0以后就行了,具體為啥沒有咋研究。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容