Flutter枚举

Enum Extension

Dart2.7版本,Dart新增了扩展函数,使枚举相关的代码定义、调用更加简洁

通过扩展枚举定义方法

定义一个元素枚举

enum Element { hydrogon, carbon, oxide }

定义一个枚举扩展,通过switch case获取每个元素的相对原子质量中文描述

extension ElementExtension on Element {
int get number {
switch (this) {
case Element.hydrogon:
return 1;
case Element.carbon:
return 6;
case Element.oxide:
return 8;
}
} String get description {
switch (this) {
case Element.hydrogon:
return '氢气';
case Element.carbon:
return '碳';
case Element.oxide:
return '氧气';
}
}

定义一个静态方法来通过相对原子质量获取

static Element fromNumber(int number) {
switch (number) {
case 1:
return Element.hydrogon;
case 6:
return Element.carbon;
case 8:
return Element.oxide;
default:
return Element.oxide;
}
}

增强枚举类型

Flutter 3.0 发布之后,直接在枚举构造方法内部定义相关属性,枚举值声明处进行声明即可

在pubspec.yaml文件中须将sdk版本设置为大于2.17.0

定义一个动物枚举,并定义成员变量nameweight和构造函数

enum Animal {

  const Animal({required this.name, required this.weight});

  final String name;
final int weight;
}

创建枚举类型dogcat

dog(name: 'dog', weight: 20),
cat(name: 'cat', weight: 6);

通过nameweight获取枚举类型

  factory Animal.fromName(String name) {
return Animal.values.firstWhere((element) => element.name == name);
} factory Animal.fromWeight(int weight) {
return Animal.values.firstWhere((element) => element.weight == weight);
}

这里直接构造了两个工厂函数,接收name或者weight参数,通过遍历Animalvalues,筛选出和参数相同的枚举类型并返回

也可以通过静态方法的方式

  static Animal fromNameStatic(String name) {
return Animal.values.firstWhere((element) => element.name == name);
} static Animal fromWeightStatic(int weight) {
return Animal.values.firstWhere((element) => element.weight == weight);
}

创建枚举并访问成员变量

const dog = Animal.dog;
log(dog.name);
log(dog.weight.toString());

定义toJson方法将枚举类型的所有信息打印

Map<String, dynamic> toJson() {
return {'name': name, 'weight': weight};
}

完整代码

enum Animal {
dog(name: 'dog', weight: 20),
cat(name: 'cat', weight: 6); const Animal({required this.name, required this.weight}); factory Animal.fromName(String name) {
return Animal.values.firstWhere((element) => element.name == name);
} factory Animal.fromWeight(int weight) {
return Animal.values.firstWhere((element) => element.weight == weight);
} static Animal fromNameStatic(String name) {
return Animal.values.firstWhere((element) => element.name == name);
} static Animal fromWeightStatic(int weight) {
return Animal.values.firstWhere((element) => element.weight == weight);
} Map<String, dynamic> toJson() {
return {'name': name, 'weight': weight};
} final String name;
final int weight;
}

Dart2.7之前

Dart 2.7 的扩展函数发布之前,一般是新建一个顶级函数/工具类内部函数,使用swtich case来返回枚举值对应的关联数据

String getName(Animal animal) {
switch (animal) {
case Animal.dog:
return 'dog';
case Animal.cat:
return 'cat';
}
}

反之亦然

Animal getType(String name) {
switch (name) {
case 'dog':
return Animal.dog;
case 'cat':
return Animal.cat;
default:
return Animal.dog;
}
}

Flutter枚举的更多相关文章

  1. flutter输入颜色枚举卡顿假死

    AndroidStudio 3.3.2 遇到 flutter输入颜色枚举卡顿假死,目前没好的解决方案,可以设置显示时间或者关闭popup窗口显示文档,这样就不会卡顿了 下面示例代码在输入 Colors ...

  2. Flutter的输入框TextField

    TextFiled组件的API 先来看一下TextFiled的构造方法: const TextField({ Key key, this.controller, this.focusNode, thi ...

  3. flutter的webview案例

    flutter 加载webview 安装插件  flutter_webview_plugin: ^0.2.1 从listview点击item跳转页面加载详情页案例 import 'dart:async ...

  4. Flutter 布局(七)- Row、Column详解

    本文主要介绍Flutter布局中的Row.Column控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Row A widget that displays its children ...

  5. Flutter学习笔记(二)

    *.assets 当引用图片的时候,需要在pubspec.yaml的文件中的flutter下添加assets,类似于下面的样子: image.png 这里需要注意的是文件里的assets只要一个缩进即 ...

  6. Flutter的原理及美团的实践

    导读 Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发布第一个版本以来,目前 ...

  7. flutter自定义View(CustomPainter) 之 canvas的方法总结

    画布canvas 画布是一个矩形区域,我们可以控制其每一像素来绘制我们想要的内容 canvas 拥有多种绘制点.线.路径.矩形.圆形.以及添加图像的方法,结合这些方法我们可以绘制出千变万化的画面. 虽 ...

  8. Flutter学习笔记(8)--Dart面向对象

    如需转载,请注明出处:Flutter学习笔记(7)--Dart异常处理 Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多 ...

  9. Flutter 基础控件

    内容: Button Image.Icon Switch.Checkbox TextField Form 1.Button RaisedButton 漂浮按钮 FlatButton 扁平按钮 Outl ...

  10. Flutter学习笔记(6)--Dart流程控制语句

    如需转载,请注明出处:Flutter学习笔记(5)--Dart流程控制语句 条件语句:if.if...elseif.if...elseif...else ; ) { print('优秀'); } &g ...

随机推荐

  1. Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出

    01.提供的接收器 Serilog 使用接收器将日志事件以各种格式写入存储.许多接收器由更广泛的 Serilog 社区开发和支持:可以通过在 NuGet 上搜索 serilog 标签找到. 02.增强 ...

  2. 墨天轮沙龙 | 亚马逊云科技李君:见微知著 - Serverless云原生数据库概览

    导读 以业务为导向的数据库需要满足现代化应用的需要,以 Serverless 数据库为代表,云数据库正在迅速发展成熟,并带来更好的可访问性和高可用性,还有高扩展性与可迁移性. [墨天轮数据库沙龙-Se ...

  3. iOS程序内语言切换使用小结

    随着时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等:想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界 ...

  4. js中 操作符new 的作用和含义

    作用:通过构造函数创建实例对象 :通过 new 出来的实例可以访问构造函数的属性和方法 :

  5. 00 你想要学习的 AI+Python,捷径在这里

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  6. kotlin更多语言结构——>空安全

    可空类型与非空类型 Kotlin 的类型系统旨在从我们的代码中消除 NullPointerException .NPE 的唯一可能的原因可能是: -  显式调用 throw NullPointerEx ...

  7. DNS域名服务及常用国内DNS服务器地址

    DNS域名服务 DNS服务器分类 缓存域名服务器 也称为高速缓存服务器 通过向其他域名服务器查询获得域名 -> IP 地址记录 将域名查询结果缓存到本地,提高重复查询时的速度 主域名服务器 特定 ...

  8. LiveData

    ViewModel 添加依赖 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' activity_main.xml < ...

  9. springboot实现验证码校验

    验证码校验共三步 1.创建验证码 2.发送验证码 3.验证码校验 创建生成验证码的工具类 public class RandomValidateCode { private Random random ...

  10. Python-提高-1

    阅读目录 1.GIL(全局解释器锁) 2.深拷贝.浅拷贝 3.私有化 4.import导入模块 5.再议 封装.继承.多态 一.GIL(全局解释器锁) GIL面试题如下 描述Python GIL的概念 ...