感谢Flutter,我开始使用Dart,我非常喜欢这种语言。
我之前使用TypeScript提供了一些我之前从未见过的非常酷的功能,我特别喜欢的是看起来像这样的string literal types
type Easing = "ease-in" | "ease-out" | "ease-in-out";
function doSomething(easing: Easing) { /* do something */}
doSomething("ease-in"); // OK
doSomething("easy"); // ERROR
在Dart中,我发现使用enum
s有时不方便,特别是在与特定于平台的插件实现交互时。每次我需要为Android的static String
s或enum
s添加Dart界面时,我都会错过字符串文字类型。
其中一个example来自android_intent
插件(但经常发生):
void _createAlarm() {
final AndroidIntent intent = const AndroidIntent(
action: 'android.intent.action.SET_ALARM',
arguments: <String, dynamic>{
'android.intent.extra.alarm.DAYS': <int>[2, 3, 4, 5, 6],
'android.intent.extra.alarm.HOUR': 21,
'android.intent.extra.alarm.MINUTES': 30,
'android.intent.extra.alarm.SKIP_UI': true,
'android.intent.extra.alarm.MESSAGE': 'Create a Flutter app',
},
);
intent.launch();
}
在Dart中有没有像TypeScript的字符串文字类型那样拥有这些“魔术字符串”的方法?
每个enum
常量创建一个Enum
实例,该实例具有toString()
方法,该方法将返回一个名为enum
类型和常量名称的字符串。例如,给定:
enum MyEnum {
myConstant,
}
然后MyEnum.myConstant.toString()
将返回"MyEnum.myConstant"
。虽然这不会让你轻松创建任意字符串,但你可以这样做:
enum alarm {
DAYS,
HOUR,
MINUTES,
SKIP_UI,
MESSAGE,
}
void _createAlarm() {
final arguments = <alarm, dynamic>{
alarm.DAYS: <int>[2, 3, 4, 5, 6],
alarm.HOUR: 21,
alarm.MINUTES: 30,
alarm.SKIP_UI: true,
alarm.MESSAGE: 'Create a Flutter app',
};
final AndroidIntent intent = const AndroidIntent(
action: 'android.intent.action.SET_ALARM',
arguments: arguments.map((k, v) => MapEntry('android.intent.extra.$k', v)),
);
intent.launch();
}