[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);
}