You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何让枚举类直接调用工厂方法生成对应枚举实例?

这个问题很常见,核心原因是你把fromSliderIndex定义成了扩展类的静态方法,而非枚举类本身的静态成员,所以编译器没法把枚举类和这个方法关联起来,只能通过扩展类名调用。下面给你两种直接解决的方案:

方案一:直接在枚举类内添加静态方法(推荐,Dart 2.17+)

Dart 2.17及以上版本允许在枚举类中定义静态方法、字段等成员,这是最直接优雅的解决方式。你只需要把fromSliderIndex方法移到枚举类内部:

/// Firmware update BLE OTA transfert speed
enum FirmwareUpdateBleOtaTransfertSpeed { 
  fast, 
  medium, 
  moderate;

  // 静态工厂方法,直接属于枚举类本身
  static FirmwareUpdateBleOtaTransfertSpeed fromSliderIndex(double value) {
    if (value > 66) return FirmwareUpdateBleOtaTransfertSpeed.fast;
    else if (value > 33) return FirmwareUpdateBleOtaTransfertSpeed.medium;
    else return FirmwareUpdateBleOtaTransfertSpeed.moderate;
  }
}

现在你就可以完全按照你想要的方式调用了:

speed = FirmwareUpdateBleOtaTransfertSpeed.fromSliderIndex(value);

方案二:兼容低版本Dart的写法

如果你的项目还在使用低于2.17的Dart版本,没法直接在枚举类内加静态方法,可以通过扩展的静态getter来间接实现枚举类调用:

/// Firmware update BLE OTA transfert speed
enum FirmwareUpdateBleOtaTransfertSpeed { fast, medium, moderate }

extension FirmwareUpdateBleOtaTransfertSpeedExtension on FirmwareUpdateBleOtaTransfertSpeed {
  // 通过静态getter把方法关联到枚举类
  static FirmwareUpdateBleOtaTransfertSpeed Function(double) get fromSliderIndex => 
      (value) {
        if (value > 66) return FirmwareUpdateBleOtaTransfertSpeed.fast;
        else if (value > 33) return FirmwareUpdateBleOtaTransfertSpeed.medium;
        else return FirmwareUpdateBleOtaTransfertSpeed.moderate;
      };
}

这种方式需要确保扩展被正确导入,调用方式和方案一完全一致,但不如方案一简洁。

补充说明

本质上,扩展的静态方法是属于扩展类的,而不是被扩展的枚举类,所以原写法只能通过扩展类名调用。要让枚举类直接调用,必须让方法成为枚举类自身的成员(方案一),或者通过语法糖间接关联(方案二)。

内容的提问来源于stack exchange,提问作者Stéphane de Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:39:10