在java中定义枚举时,可以执行与以下类似的操作。在达特这可能吗?
enum blah {
one(1), two(2);
final num value;
blah(this.value);
}
答案 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