Dart:枚举上的扩展方法不起作用 "The method isn't defined for the class"
Dart: Extension method on enum doesn't work "The method isn't defined for the class"
basend 我用扩展方法在 dart 中创建了一个枚举:
enum TagVisibility {
public,
shared,
private,
}
extension on TagVisibility {
String get german {
switch(this){
case TagVisibility.public: return "Für alle sichtbar";
case TagVisibility.shared: return "Für alle mit demselben Tag sichtbar";
case TagVisibility.private: return "Nur für mich sichtbar";
default: throw Exception("enum has more cases");
}
}
}
但是当我尝试调用此扩展方法时出现错误 Error: The method 'german' isn't defined for the class 'TagVisibility'.
:
import 'package:prototype/models/visibility.dart';
...
DropdownButton<TagVisibility>(
hint: Text("Wähle die Sichtbarkeit für diesen Tag"),
value: _visibility ?? _visibilityDefault,
onChanged: (visibility) {
setState(() {
_visibility = visibility;
});
},
// items: List<DropdownMenuItem<TagVisibility>>(
items: TagVisibility.values.map((visibility) => DropdownMenuItem(
value: visibility,
child: Text('${visibility.german()}'), // doesn't work
// child: Text('${visibility.toString()}'), // works, but I want the custom messages.
),
).toList(),
),
我完全不知道我在这里做错了什么。你能解释一下我怎样才能让这个工作吗?谢谢!
您定义为getter:
...
String get german {
...
但将其用作方法:
...
child: Text('${visibility.german()}'), // doesn't work
...
你应该做的是将其用作getter:
...
child: Text('${visibility.german}'), // this should work
...
我在这里找到了解决方案:
有两种方法:
解决方法一:将扩展方法放在dart中,用到的地方。
但通常最好将扩展方法与对应的枚举放在同一个文件中。所以我更喜欢这个:
解决方案编号 2: 为扩展名指定一个不同于枚举名称的名称。代码:
enum TagVisibility {
public,
shared,
private,
}
extension TagGerman on TagVisibility {
String get german {
switch(this){
case TagVisibility.public: return "Für alle sichtbar";
case TagVisibility.shared: return "Für alle mit demselben Tag sichtbar";
case TagVisibility.private: return "Nur für mich sichtbar";
default: throw Exception("enum has more cases");
}
}
}
您需要为扩展程序命名。
Dart 扩展可以在没有名称的情况下声明,但这只是意味着它们被赋予了一个新的 private 名称,因此扩展只能在它所在的库中访问宣布。你基本上永远不会想要没有名字的扩展。
如果您给它起一个 public 名称,那么扩展可以与枚举一起导入到其他库中。
另一种方法
enum TagVisibility {
public,
shared,
private,
}
extension TagGerman on TagVisibility {
String get german {
var values= ["Für alle sichtbar",
"Für alle mit demselben Tag sichtbar",
"Nur für mich sichtbar"];
return values.elementAt(index);
}
}
}
总是在你要使用它的地方添加 import '.../your_file.dart'
别忘了测试!!!如果添加更多枚举项
,请注意 RangeError 异常
group('Tag Visibility German', () {
test('public german should be Für alle sichtbar', () {
expect('Für alle sichtbar', TagVisibility.public.german());
});
...
});
使用 Dart 2.17
,您不需要使用扩展。您可以简单地将您的方法放在 enum
中。例如:
enum TagVisibility {
public,
shared,
private;
String get german {
switch(this){
case public: return "...";
case shared: return "...";
case private: return "...";
}
}
}
basend
enum TagVisibility {
public,
shared,
private,
}
extension on TagVisibility {
String get german {
switch(this){
case TagVisibility.public: return "Für alle sichtbar";
case TagVisibility.shared: return "Für alle mit demselben Tag sichtbar";
case TagVisibility.private: return "Nur für mich sichtbar";
default: throw Exception("enum has more cases");
}
}
}
但是当我尝试调用此扩展方法时出现错误 Error: The method 'german' isn't defined for the class 'TagVisibility'.
:
import 'package:prototype/models/visibility.dart';
...
DropdownButton<TagVisibility>(
hint: Text("Wähle die Sichtbarkeit für diesen Tag"),
value: _visibility ?? _visibilityDefault,
onChanged: (visibility) {
setState(() {
_visibility = visibility;
});
},
// items: List<DropdownMenuItem<TagVisibility>>(
items: TagVisibility.values.map((visibility) => DropdownMenuItem(
value: visibility,
child: Text('${visibility.german()}'), // doesn't work
// child: Text('${visibility.toString()}'), // works, but I want the custom messages.
),
).toList(),
),
我完全不知道我在这里做错了什么。你能解释一下我怎样才能让这个工作吗?谢谢!
您定义为getter:
...
String get german {
...
但将其用作方法:
...
child: Text('${visibility.german()}'), // doesn't work
...
你应该做的是将其用作getter:
...
child: Text('${visibility.german}'), // this should work
...
我在这里找到了解决方案:
有两种方法:
解决方法一:将扩展方法放在dart中,用到的地方。 但通常最好将扩展方法与对应的枚举放在同一个文件中。所以我更喜欢这个:
解决方案编号 2: 为扩展名指定一个不同于枚举名称的名称。代码:
enum TagVisibility {
public,
shared,
private,
}
extension TagGerman on TagVisibility {
String get german {
switch(this){
case TagVisibility.public: return "Für alle sichtbar";
case TagVisibility.shared: return "Für alle mit demselben Tag sichtbar";
case TagVisibility.private: return "Nur für mich sichtbar";
default: throw Exception("enum has more cases");
}
}
}
您需要为扩展程序命名。
Dart 扩展可以在没有名称的情况下声明,但这只是意味着它们被赋予了一个新的 private 名称,因此扩展只能在它所在的库中访问宣布。你基本上永远不会想要没有名字的扩展。
如果您给它起一个 public 名称,那么扩展可以与枚举一起导入到其他库中。
另一种方法
enum TagVisibility {
public,
shared,
private,
}
extension TagGerman on TagVisibility {
String get german {
var values= ["Für alle sichtbar",
"Für alle mit demselben Tag sichtbar",
"Nur für mich sichtbar"];
return values.elementAt(index);
}
}
}
总是在你要使用它的地方添加 import '.../your_file.dart'
别忘了测试!!!如果添加更多枚举项
,请注意 RangeError 异常 group('Tag Visibility German', () {
test('public german should be Für alle sichtbar', () {
expect('Für alle sichtbar', TagVisibility.public.german());
});
...
});
使用 Dart 2.17
,您不需要使用扩展。您可以简单地将您的方法放在 enum
中。例如:
enum TagVisibility {
public,
shared,
private;
String get german {
switch(this){
case public: return "...";
case shared: return "...";
case private: return "...";
}
}
}