Stéphane de Luca
Stéphane de Luca

Reputation: 13611

How to write an enum factory in dart?

I have this enum:

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

With the following extension:

extension FirmwareUpdateBleOtaTransfertSpeedExtension
    on FirmwareUpdateBleOtaTransfertSpeed {

  static FirmwareUpdateBleOtaTransfertSpeed fromSliderIndex(double value) {
    if (value > 66)
      return FirmwareUpdateBleOtaTransfertSpeed.fast;
    else if (value > 33)
      return FirmwareUpdateBleOtaTransfertSpeed.medium;
    else
      return FirmwareUpdateBleOtaTransfertSpeed.moderate;
  }
}

And I'd like to use my factory as follows:

speed = FirmwareUpdateBleOtaTransfertSpeed
                        .fromSliderIndex(value);

But it does not compile. I must use the name of the extension as follows:

speed = FirmwareUpdateBleOtaTransfertSpeedExtension
                        .fromSliderIndex(value);

How can I use the enum class directly to generate the right enum?

Upvotes: 3

Views: 4011

Answers (1)

mmcdon20
mmcdon20

Reputation: 6756

If you want the static method to be called on your enum, you need to define the static method directly inside the enum itself rather than in an extension.

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;
  }
}

You can also define as an actual factory constructor:

enum FirmwareUpdateBleOtaTransfertSpeed {
  fast,
  medium,
  moderate;

  factory FirmwareUpdateBleOtaTransfertSpeed.fromSliderIndex(double value) {
    if (value > 66)
      return FirmwareUpdateBleOtaTransfertSpeed.fast;
    else if (value > 33)
      return FirmwareUpdateBleOtaTransfertSpeed.medium;
    else
      return FirmwareUpdateBleOtaTransfertSpeed.moderate;
  }
}

Note that you have to use dart 2.17 or higher in order to use the enhanced enums feature.

Upvotes: 5

Related Questions