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以后就行了,具体为啥没有咋研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容