[Flutter] 枚举类enum与包拓展extension

枚举类Enum

简单描述应用场景:

通过接口异步获取数据时,发起请求后,一般有三种状态

等待:LOADING

成功:SUCCESS

错误:ERROR

enum getDataFromApi(
LOADING,//等待
SUCCESS,//成功
ERROR	//错误
)

这样就可以获取接口数据的代码解耦,你只需要通过对应的枚举变量来写对应的实现(枚举类本身不写实现,一般通过switch或者if语句来判断)。

  • 枚举是一种有穷序列集的数据类型

  • 使用关键字enum定义一个枚举

  • 枚举常用于代替常量,控制语句等

enum Season{
  SPRING,//春天
  SUMMER,//夏天
  AUTUWN,//秋天
  WINTER //冬天
}

void main() {
  Season season = Season.SPRING;
  switch (season) {
    case Season.SPRING:
      print("春");
      break;
    case Season.SUMMER:
      print("夏");
      break;
    case Season.AUTUWN:
      print("秋");
      break;
    case Season.WINTER:
      print("冬");
      break;
  }
}

//output: 春

包拓展extension

extension的主要功能是给已经存在的类添加新的member function,往里面增加新的函数。可以对Iterable,String这样的常用类增加一些方法

对String添加拓展

extension StringToNumber on String {
  int toInt() {
    return int.parse(this);
  }
  // ···
}

使用

import 'string_to_number.dart';
// ···
print('18'.toInt()); 

//output: 18

枚举类和包拓展结合

通过包拓展,可以另外写一个类对枚举类进行实现,这样既不用动枚举类,也不用在逻辑页面写一大堆枚举类的实现。

void main() {
 //使用
 print(Season.SPRING.seasonName);
 //output: 春天
}

//枚举类
enum Season{
  SPRING,//春天
  SUMMER,//夏天
  AUTUWN,//秋天
  WINTER //冬天
}

//对枚举类的拓展
extension PrintSeason on Season{
    //枚举变量的实现方法
  String get seasonName{
    switch(this){
      case Season.SPRING:
        return '春天';
      case Season.SUMMER:
        return '夏天';
      case Season.AUTUWN:
        return '秋天';
      case Season.WINTER:
        return '冬天';
      default:
        return '无';
    }
  }
  
}

Dart2.17更新

现在枚举类里面可以定义成员变量了,枚举实现可以写在枚举类里面,复杂的实现还是可以通过包拓展来写。

enum Season {
  SPRING('春天'),
  SUMMER('夏天'),
  AUTUMN('秋天'),
  WINTER('冬天');
  
  final String seasonName;
  const Season(this.seasonName);
  
  @override
  String toString() => 'The $name is $seasonName';
}

void main() {
  print(Season.SUMMER);
}
posted @ 2022-04-25 16:23  漫游者杰特  阅读(1482)  评论(0编辑  收藏  举报