例如,下面的小测试代码片段每次返回'day.MONDAY',而我希望得到的是'MONDAY'。
enum day {MONDAY, TUESDAY}
print( 'Today is $day.MONDAY');
print( 'Today is $day.MONDAY.toString()');
我理解的是,要仅获取“MONDAY”,需要解析字符串,是这样吗?
enum day {MONDAY, TUESDAY}
print( 'Today is $day.MONDAY');
print( 'Today is $day.MONDAY.toString()');
我理解的是,要仅获取“MONDAY”,需要解析字符串,是这样吗?
enum Day { monday, tuesday }
main() {
Day monday = Day.monday;
print(monday.name); //prints 'monday'
}
enum Day { monday, tuesday }
extension ParseToString on Day {
String toShortString() {
return this.toString().split('.').last;
}
}
main() {
Day monday = Day.monday;
print(monday.toShortString()); //prints 'monday'
}
describeEnum
是 Flutter 中的一个方法,问题是如何在 Dart 中获取枚举的值。 - mbartnParseToString
。请记住,如果您需要i18n,则使用枚举作为字符串可能不是最佳方法。仍然需要一些“中间”代码。 - Adrian Moisaenum Day {
monday,
tuesday,
}
name
属性。String monday = Day.monday.name; // 'monday'
1. 直接方式:
var dayInString = describeEnum(Day.monday);
print(dayInString); // prints 'monday'
2. 使用扩展: extension DayEx on Day {
String get name => describeEnum(this);
}
您可以像这样使用它:
void main() {
Day monday = Day.monday;
print(monday.name); // 'monday'
}
describeEnum
是一个好方法。使用扩展是一个不错的附加功能。 - pierreadescribeEnum
是仅通过Flutter框架才能使用的方法。因此不适用于那些希望在纯Dart中执行相同操作的人们。 - shennan稍微短一点:
String day = theDay.toString().split('.').last;
以前正确的方式是通过toString
方法获取枚举值的源名称,该方法返回"day.MONDAY"
而不是更有用的"MONDAY"
。
自Dart 2.15以来,枚举类型已经公开了扩展getter,它只返回源名称,因此day.MONDAY.name == "MONDAY"
。
自Dart 2.17以来,您还可以向enum
声明中添加自己的成员,并选择为某个值提供另一个名称,而不仅仅是其源名称,例如,具有更适当的大写:
enum Day {
monday("Monday"),
tuesday("Tuesday"),
// ...
saturday("Saturday");
sunday("Sunday");
final String name;
Day(this.name);
// And other members too.
bool get isWorkday => index < saturday.index;
}
然后你会得到 Day.sunday.name == "Sunday"
(隐藏了扩展的name
getter,它将返回“sunday”)。
在这些功能之前,你只能从toString
字符串中提取其余部分来获取名称:
day theDay = day.MONDAY;
print(theDay.toString().substring(theDay.toString().indexOf('.') + 1));
不可否认,这个方式确实非常不方便。
另一种将枚举类型名称转换为字符串的方式更短,但也不太高效,因为它会多创建一个不必要的字符串作为前缀:
theDay.toString().split('.').last
如果性能不重要,那可能就是我会写的,只为了简洁。
如果你想迭代所有值,可以使用day.values
:
for (day theDay in day.values) {
print(theDay);
}
doSomething1([Status status = Status.off]) {
处出现了错误。DartPad - Günter Zöchbauer从flutter/foundation.dart中获取枚举名称的最简单方法是使用标准方法。
describeEnum(enumObject)
enum Day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
void validateDescribeEnum() {
assert(Day.monday.toString() == 'Day.monday');
assert(describeEnum(Day.monday) == 'monday');
}
enum day {MONDAY, TUESDAY}
print( 'Today is ${describeEnum(day.MONDAY)}' );
控制台输出:今天是星期一
有一个更加优雅的解决方案:
enum SomeStatus {
element1,
element2,
element3,
element4,
}
const Map<SomeStatus, String> SomeStatusName = {
SomeStatus.element1: "Element 1",
SomeStatus.element2: "Element 2",
SomeStatus.element3: "Element 3",
SomeStatus.element4: "Element 4",
};
print(SomeStatusName[SomeStatus.element2]) // prints: "Element 2"
enum.name
,所以没有理由再使用这种模式了。 - rjh有时候我需要区分UI值和真实值,所以我使用Map
定义了键和值。通过这种方式,我们具有更多的灵活性。并且通过使用extension
(自Dart 2.7开始),我创建了一个方法来读取其键和值。
enum Status {
progess,
done,
}
extension StatusExt on Status {
static const Map<Status, String> keys = {
Status.progess: 'progess',
Status.done: 'done',
};
static const Map<Status, String> values = {
Status.progess: 'In Progress',
Status.done: 'Well done',
};
String get key => keys[this];
String get value => values[this];
// NEW
static Status fromRaw(String raw) => keys.entries
.firstWhere((e) => e.value == raw, orElse: () => null)
?.key;
}
// usage 1
Status status = Status.done;
String statusKey = status.key; // done
String statusValue = status.value; // Well done
// usage 2 (easy to make key and value list)
List<Status> statuses = Status.values;
List<String> statusKeys = statuses.map((e) => e.key).toList();
List<String> statusValues = statuses.map((e) => e.value).toList();
// usage 3. create Status enum from string.
Status done1 = StatusExt.fromRaw('done') // Status.done
Status done2 = StatusExt.fromRaw('dude') // null
在Dart 2.17中,我们现在可以对枚举成员进行一般性支持。 这意味着我们可以添加保存状态的字段、设置该状态的构造函数、具有功能的方法,甚至覆盖现有成员。
示例:
enum Day {
MONDAY("Monday"),
TUESDAY("Tuesday");
const Day(this.text);
final String text;
}
输出:
void main() {
const day = Day.MONDAY;
print(day.text); /// Monday
}
对于上述功能,覆盖Dart版本如下,目标为2.17及以上
environment:
sdk: ">=2.17.0 <3.0.0"
我使用以下结构:
abstract class Strings {
static const angry = "Dammit!";
static const happy = "Yay!";
static const sad = "QQ";
}
abstract
关键字使其不能被实例化,因为没有理由想要实例化这个类。 - KR Tirtho