在dart中为枚举添加方法或值

时间:2016-08-12 00:58:39

标签: dart

在java中定义枚举时,可以执行与以下类似的操作。在达特这可能吗?

enum blah {
  one(1), two(2);
  final num value;
  blah(this.value);
}

8 个答案:

答案 0 :(得分:20)

从Dart 2.6开始,您可以定义类的扩展。

enum Cat {
  black,
  white
}

extension CatExtension on Cat {

  String get name {
    switch (this) {
      case Cat.black:
        return 'Mr Black Cat';
      case Cat.white:
        return 'Sir White Cat';
      default:
        return null;
    }
  }

  void talk() {
    print('meow');
  }
}

示例:

Cat cat = Cat.black;
String catName = cat.name;
cat.talk();

这是另一个实时示例(使用常量映射而不是开关): https://dartpad.dartlang.org/c4001d907d6a420cafb2bc2c2507f72c

答案 1 :(得分:17)

Dart枚举仅用于最简单的情况。如果您需要更强大或更灵活的枚举,请使用具有静态const字段的类,如https://stackoverflow.com/a/15854550/217408

中所示

这样你可以添加你需要的任何东西。

答案 2 :(得分:9)

不。在Dart中,枚举只能包含枚举项:

enum Color {
  red,
  green,
  blue
}

但是,枚举中的每个项目都自动具有与之关联的索引号:

print(Color.red.index);    // 0
print(Color.green.index);  // 1

您可以按索引号获取值:

print(Color.values[0] == Color.red);  // True

请参阅:https://www.dartlang.org/guides/language/language-tour#enums

答案 3 :(得分:4)

扩展很好,但是不能添加静态方法。如果要执行MyType.parse(string)之类的操作,请考虑使用带有静态const字段的类(如GünterZöchbauer之前建议的那样)。

这是一个例子

class PaymentMethod {
  final String string;
  const PaymentMethod._(this.string);

  static const online = PaymentMethod._('online');
  static const transfer = PaymentMethod._('transfer');
  static const cash = PaymentMethod._('cash');

  static const values = [online, transfer, cash];

  static PaymentMethod parse(String value) {
    switch (value) {
      case 'online':
        return PaymentMethod.online;
        break;
      case 'transfer':
        return PaymentMethod.transfer;
        break;
      case 'cash':
        return PaymentMethod.cash;
      default:
        print('got error, invalid payment type $value');
        return null;
    }
  }

  @override
  String toString() {
    return 'PaymentMethod.$string';
  }
}

我发现这比使用辅助功能要方便得多。

final method = PaymentMethod.parse('online');
assert(method == PaymentMethod.online);

答案 4 :(得分:2)

我这样做了(灵感来自@vovahost接受的答案)

enum CodeVerifyFlow{
  SignUp, Recovery, Settings
}

extension CatExtension on CodeVerifyFlow {
  String get name {
    return ["sign_up", "recovery", "settings"][this.index];
  }
}

// use it like
CodeVerifyFlow.SignUp.name

稍后谢谢!

答案 5 :(得分:1)

它可能不是“有效Dart”,我在Helper类中添加了一个静态方法(Dart中没有伴随对象)。

在您的color.dart文件中

enum Color {
  red,
  green,
  blue
}

class ColorHelper{

  static String getValue(Color color){
    switch(color){
      case Color.red: 
        return "Red";
      case Color.green: 
        return "Green";
      case Color.blue: 
        return "Blue";  
      default:
        return "";
    }
  }

}

由于该方法与枚举在同一个文件中,因此一次导入就足够了

import 'package:.../color.dart';

...
String colorValue = ColorHelper.getValue(Color.red);

答案 6 :(得分:0)

对于字符串返回:

enum Routes{
  SPLASH_SCREEN,
  HOME,
  // TODO Add according to your context
}

String namedRoute(Routes route){
  final runtimeType = '${route.runtimeTypes.toString()}.';
  final output = route.toString();
  return output.replaceAll(runtimeType, "");
}

答案 7 :(得分:0)

作为对使用Extensions的其他建议的改进,您可以在地图列表中定义分配的值,并且扩展名将简洁明了。

fun providesSharedPreference(): SharedPreferences {
    var sharedPreferences: SharedPreferences

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        sharedPreferences = EncryptedSharedPreferences.create(
            application,
            Constant.SHARED_PREFERENCE_NAME,
            getMasterKey(),
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        )

    } else {
        sharedPreferences =
            application.getSharedPreferences(
                Constant.SHARED_PREFERENCE_NAME,
                Context.MODE_PRIVATE
            )
    }
    return sharedPreferences
}

private fun getMasterKey(): MasterKey {
    return MasterKey.Builder(application)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build()
}

带有列表的示例

enum Numbers {
  one,
  two,
  three,
}

// Numbers.one.value == 1

地图示例

extension NumbersExtensionList on Numbers {
  static const values = [1, 2, 3];
  int get value => values[this.index];
}

注意:这种方法的局限性在于您不能不能在枚举中定义静态工厂方法,例如extension NumbersExtensionMap on Numbers { static const valueMap = const { Numbers.one: 1, Numbers.two: 2, Numbers.three: 2, }; int get value => valueMap[this]; } (自Dart 2.9起)。您可以 Numbers.create(1)上定义此方法,但是需要像NumbersExtension

那样调用它。