首页 > 其他分享 >在 flutter 中使用枚举的技巧

在 flutter 中使用枚举的技巧

时间:2022-11-06 22:35:34浏览次数:73  
标签:技巧 ActivityType number value final 枚举 activity flutter String

在 flutter 中使用枚举的技巧

前言

例如,不管是谁在 Kotlin 之后,再开发 Dart 都对它带来的种种限制感到失望。

其中之一是枚举类。单独使用枚举值是可以的,但是还有别的吗?你不得不用枚举,对吧?

这篇文章将会推荐几个 enum 枚举的使用技巧。

正文

旧的方式, 通过 extension 扩展枚举值

让我们提醒自己,这样的代码可能是什么样子的。下面是一组 ActivityType 。在某些时候,我们希望为每个活动分配一个数字和一个字符串值。也许我们的后端返回一个数字,但是我们当然不想在我们的应用程序代码中使用奇怪的数字来标记。相反,我们决定使用枚举。

enum ActivityType {

  running,

  climbing,

  hiking,

  cycling,

  ski

}


extension ActivityTypeNumber on ActivityType {

  int get number {

    switch (this) {

      case ActivityType.running:

        return 1;

      case ActivityType.climbing:

        return 2;

      case ActivityType.hiking:

        return 5;

      case ActivityType.cycling:

        return 7;

      case ActivityType.ski:

        return 10;

    }

  }

}
extension ActivityTypeValue on ActivityType {

  String get value {

    switch (this) {

      case ActivityType.running:

        return 'Running';

      case ActivityType.climbing:

        return 'Climbing';

      case ActivityType.hiking:

        return 'Hiking';

      case ActivityType.cycling:

        return 'Cycling';

      case ActivityType.ski:

        return 'Skiing';

    }

  }

}

为了访问数字或 String 值:

final climbingInt = ActivityType.climbing.number;
final climbingString = ActivityType.climbing.value;

现在使用新的枚举值方式

幸运的是,随着 2022 年 5 月在 Google I/O 上发布 Flutter 3.0,我们不必再依赖这些令人长长的代码了。让我们使用新的和增强的枚举类重写代码。

https://medium.flutterdevs.com/flutter-3-0-whats-new-in-flutter-12259bf090ba

enum ActivityType {

  running(1, 'Running'),

  climbing(2, 'Climbing'),

  hiking(5, 'Hiking'),

  cycling(7, 'Cycling'),

  ski(10, 'Skiing');


  const ActivityType(this.number, this.value);



  final int number;

  final String value;

}

其实就是赋予了一些类的特性

所以这次很聪明! 访问值或数值保持不变。

在工作中,我们通常希望获得一个枚举或一个基于数字的值,这些数字是从后端接收的。

或者,基于活动的字符串名称(比如,如果我们得到“攀登”并想将其映射到 ActivityType.)。这一切都很容易做到:

enum ActivityType {

  running(1, 'Running'),

  climbing(2, 'Climbing'),

  hiking(5, 'Hiking'),

  cycling(7, 'Cycling'),

  ski(10, 'Skiing');


  const ActivityType(this.number, this.value);



  final int number;

  final String value;  static ActivityType getTypeByTitle(String title) =>
    ActivityType.values.firstWhere((activity) => activity.name == title);
  static ActivityType getType(int number) => ActivityType.values.firstWhere((activity) => activity.number == number);


  static String getValue(int number) => ActivityType.values.firstWhere((activity) => activity.number == number).value;

}

Name 是每个 enum 的默认属性,并返回一个该 enum 值的字符串,例如, activitytype.ski.name 是“ ski”。

final activityType = ActivityType.getTypeByTitle('hiking');

Console:
I/flutter ( 2896): activity: ActivityType.hiking

unknown 异常处理

请记住,如果由于某种原因所提供的标题或数字不在您的活动标题/数字中,您将得到一个糟糕的状态异常。这个案子有用:

正常访问

final activityType = ActivityType.getType(7);
final activityValue = ActivityType.getValue(7);
print('activity: $activityType - $activityValue');

Console:
I/flutter (24956): activity: ActivityType.cycling - Cycling

但这个不是:

final activityType = ActivityType.getType(77);
Console:

======== Exception caught by widgets library =======================================================

The following StateError was thrown building ActivityListScreen(dirty, state: _ConsumerState#c9a6a):

Bad state: No element
....

这是因为我们没有提供或 Else ()子句。函数。为了不出现错误,我们可以默认为未知类型:

enum ActivityType {

  running(1, 'Running'),

  climbing(2, 'Climbing'),

  hiking(5, 'Hiking'),

  cycling(7, 'Cycling'),

  ski(10, 'Skiing'),

  unknown(-1, '');

  const ActivityType(this.number, this.value);

  final int number;

  final String value;static ActivityType getTypeByTitle(String title) =>
    ActivityType.values.firstWhere((activity) => activity.name == title, orElse: () => ActivityType.unknown);

  static ActivityType getType(int number) =>
      ActivityType.values.firstWhere((activity) => activity.number == number, orElse: () => ActivityType.unknown);


  static String getValue(int number) =>
      ActivityType.values.firstWhere((activity) => activity.number == number, orElse: () => ActivityType.unknown).value;

}

extension 扩展处理枚举

或者只是不添加未知类型,而是返回一个可为空的值。这需要我们向列表中添加一个扩展函数。我发现它在应用程序的其他部分也很有用,不仅仅是枚举:

extension ListExtension<T> on List<T> {

  T? firstWhereOrNull(bool Function(T element) condition) {

    for (final element in this) {

      if (condition(element)) return element;

    }

    return null;

  }

}

然后我们的 ActivityType 看起来像这样:

enum ActivityType {

  running(1, 'Running'),

  climbing(2, 'Climbing'),

  hiking(5, 'Hiking'),

  cycling(7, 'Cycling'),

  ski(10, 'Skiing');


  const ActivityType(this.number, this.value);


  final int number;

  final String value;  static ActivityType? getTypeByTitle(String title) =>
    ActivityType.values.firstWhereOrNull((activity) => activity.name == title);

  static ActivityType? getType(int number) =>
      ActivityType.values.firstWhereOrNull((activity) => activity.number == number);

  static String? getValue(int number) =>
      ActivityType.values.firstWhereOrNull((activity) => activity.number == number)?.value;

}

对于一些奇怪的输入数据,我们得到的是空值,而不是异常和红色屏幕。

final activity = ActivityType.getTypeByTitle('abc');
final activityType = ActivityType.getType(77);
final activityValue = ActivityType.getValue(99);
print('$activity - $activityType - $activityValue');

Console:
I/flutter ( 2896): null - null - null

加入自定义函数 如 activityString()

根据您的需要、后端返回的内容等,选择两种方法中的一种。

还有一件事,当然可以使用非静态函数,比如下面的 activityString() :

enum ActivityType {

  running(1, 'Running'),

  climbing(2, 'Climbing'),

  hiking(5, 'Hiking'),

  cycling(7, 'Cycling'),

  ski(10, 'Skiing');


  const ActivityType(this.number, this.value);


  final int number;

  final String value;  static ActivityType? getTypeByTitle(String title) =>
    ActivityType.values.firstWhereOrNull((activity) => activity.name == title);

  static ActivityType? getType(int number) =>
      ActivityType.values.firstWhereOrNull((activity) => activity.number == number);

  static String? getValue(int number) =>
      ActivityType.values.firstWhereOrNull((activity) => activity.number == number)?.value;

  String activityString(String userName) => '$userName is $value';

}

然后,对某个枚举调用它,得到一个漂亮的字符串,您可以立即在 UI 中使用该字符串:

final userIsWorkingOut = ActivityType.climbing.activityString('Emily Jules');

print('$userIsWorkingOut');

Console:
I/flutter (28053): Emily Jules is Climbing

就是这样! 享受在 Flutter 中使用一个增强的枚举

标签:技巧,ActivityType,number,value,final,枚举,activity,flutter,String
From: https://www.cnblogs.com/ducafecat/p/16864409.html

相关文章

  • Day03.1:初学者安装IDEA后需要知道的小技巧
    初学者安装IDEA后需要知道的小技巧1.输入psvm直接生成main方法2.输入sout可以直接生成输出语句3.代码放大设置4.注释颜色更改5.代码字体大小通过Ctrl+鼠标滑轮......
  • C/C++中的枚举数据类型
    关键字:Emum自定义名称{a=1b=2,c=3,d=4}box;定义好之后可以直接通过box关键字调用ennumbag{book1="百年孤独",book2="时间简史",book3="简爱"}boo......
  • 【面试题】面试小技巧:如果有人问你 xxx 技术是什么?
    背景在前几天,有一个朋友突然问了我一个问题,说如果有人问你“React是什么?你怎么回答。 ”,我当时脱口而出“React是一个网页UI框架一个,它的特点声明式、组件化、组件化、......
  • QString的一些使用技巧
    简介QString字符串被每个GUI程序所使用,不仅是用户界面,还有数据结构。C++原生提供两种字符串:传统的C风格以'\0'结尾的字符数组和std::string类。与这些不同,QString使......
  • 阅读代码技巧
    如何快速上手?一、了解业务梳理实现的业务功能1.系统有没有文档、教程、分享文章等2.代码的主要业务功能是什么3.业务功能使用的角色是哪些,数量是多少,种类是多少4.业......
  • 1个 GIS 中的热图 创建技巧
      有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少......
  • Ansible - 9 - 技巧提示
    Ansible技巧提示1-免密登录#通过秘钥方式连接ssh-keygen-trsassh-copy-id-i/vipxf/.ssh/[email protected]/vipxf/.ssh/id_rsa......
  • 野花--flex布局小技巧之让某个子元素靠右或靠左显示
    flex布局小技巧之让某个子元素靠右或靠左显示以下以块元素的Flex布局为示例:只需要两句代码,轻松搞定!代码1:在父元素里面加入以下代码:(父盒子加了display:flex,就相当于起到......
  • TypeScript常用类型(基本类型,数组类型,类型别名type ,函数类型,对象类型,接口interface,元组
    原始基本类型letage:number=18;letmyname:string="tom";letflag:boolean=true;leta:null=null;letb:undefined=undefined;letc:symbol......
  • LP1-5:WEB应用测试技巧
    一、静态页面静态文字1)检查一个页面或者一组中多个页面的字体、size、颜色、位置等因素是否符合需求;2)检查页面文字图标的间距、行距是否统一,对齐方式是否统一......