我的应用程序连接到一个定制的外围设备,并从中提取一些值作为int,我想将其转换为enum以简化应用程序代码.

随着硬件的不断发展,众所周知,新的价值观将会出现.

在我的Flatter应用程序中,我通过枚举扩展处理已知值(在编写应用程序时),提供如下"未知"值:


// Battery live data originator protocol
enum BatteryLiveDataProtocol {
  unknown, // 0
  rs485, // 1
  ttl, // 2
  canbus, // 3
  uart, //4
 ;
}

extension BatteryLiveDataProtocolExtension on BatteryLiveDataProtocol {
  /// Build the enum out of the int number
  static BatteryLiveDataProtocol fromNumber(int number) {
    switch (number) {
      case 1:
        return ttl;
      case 2:
        return rs485;
      case 3:
        return canbus;
      case 0:
      default:
        return unknown;
    }
  }
  /// Returns the number correpsonding to the enum
  int get number {
    switch (this) {

      case rs485:
        return 1;
      case ttl:
        return 2;
      case canbus:
        return 3;
      case unknown:
      default:
        return 0;
    }
  }

如您所见,此代码非常方便地支持future 版本:

const futureValue = 13;
final p = BatteryLiveDataProtocol.fromNumber(futureValue);

自从推出Dart 2.17(Flutter 3)以来,我想利用增强的枚举,如下所示:

// Battery live data originato protocol
enum BatteryLiveDataProtocol {
  unknown(),
  rs485(1),
  ttl(2),
  canbus(3),
  uart(4),
  ;

  const BatteryLiveDataProtocol(this.value);
  final num value;
}

但是,我如何处理future 的枚举值呢?

我可以这样做,无论我想在哪里将int转换为enum:

BatteryLiveDataProtocol p;
try {
   const futureValue = 13;
   p = BatteryLiveDataProtocol(futureValue);
} catch(e) {
   p = BatteryLiveDataProtocol.unknown;
}

但这很麻烦,不是吗?我们有可能自己提供 const BatteryLiveDataProtocol(this.value);具尸体,这太酷了.

[更新]顺便说一句,不确定它是否足够清晰,但仍然可以在增强的枚举中创建静态函数,如下所示:


  static BatteryLiveDataProtocol fromValue(int v) {
    BatteryLiveDataProtocol p;
    try {
      p = BatteryLiveDataProtocol[v];
    } catch (e) {
      p = unknown;
    }
    return p;
  }

并按如下方式使用:

const futureValue = 13;
final p = BatteryLiveDataProtocol.fromValue(futureValue);

// Makes p being set to "unknown".

那么,我的问题#1:有没有更好/更聪明(即方便)的方法来处理future 价值?

问题#2:其他语言处理future 的枚举(例如在Swift中):有没有办法生成unknown(actualValue)作为动态枚举值?

推荐答案

感谢@mmcdon20的工厂提案(顺便说一句,我无法在下面的代码中用factory替换static).

但我们需要确保处理任何值:值和索引可能不同,如我在下面提出的修改示例中所述,其中unknown中的value现在设置为-1(index0).

因此,代码必须处理它:

/// Battery live data originato protocol
enum BatteryLiveDataProtocol {
  unknown(-1),
  rs485(1),
  ttl(2),
  canbus(3),
  uart(4),
  ;

  const BatteryLiveDataProtocol(this.value);
  final num value;

  static BatteryLiveDataProtocol fromValue(int v) =>
      values.firstWhere((x) => x.value == v, orElse: () => unknown);
}

Dart相关问答推荐

在异步方法中,有没有更优雅的方式在DART中等待!=NULL?

Dart中的运算符(){…}做什么?

Flutter中TextFieldForm中的字母间距

是否从 Dart 中删除了interface关键字?

什么时候在 Dart 中使用interfaces接口?

Swipe返回手势

如何保存 List 并使用 Hive 检索?

如何使用Flutter dio 下载文件?

如何签署 Flutter 的应用程序

Package:flutter/src/widgets/overlay.dart':Failed assertion: line 133 pos 12: "_overlay != null"

如何从JSON对象获取格式化/缩进的JSON字符串?

无法导入 dart 的 intl 包

如何判断两张 map 的省道是否相等

如何实现从左侧滑动的侧边菜单?

如何突出显示所选卡片的边框?

错误:default constructor is already defined

带范围的dartswitch

Cancel stream onData

从dart语言列表中过滤空值的最佳方法是什么

使用 VSCode 创建和运行 Dart 控制台应用程序?