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
相关产品推荐
相关产品推荐

