我觉得这是一个愚蠢的问题,但我无法解决它。
我所拥有的:
if (current is classA){
//do stuff
return;
}
if (current is classB){
//do stuff
return;
}
if (current is classC){
//do stuff
return;
}
我想要什么:
switch (currentState) {
case is classA: {
//do stuff
break;
}
case is classB: {
//do stuff
break;
}
case is classC: {
//do stuff
break;
}
}
我真正想要的(科特琳):
When (currentState){
is classA -> //do stuff
is classB -> //do stuff
is classC -> //do stuff
}
无论如何,我是否可以像Kotlins When运算符一样使用Dart Switch,或者至少使用==来确定案件评估的其他运算符?
答案 0 :(得分:1)
否。
Dart开关盒是一个非常低级的构造。它仅允许不覆盖运算符==
的常量值表达式(少数基本平台类型除外),因此可以有效地使用identical
检查来实现它。
没有能力执行复杂的检查,或检查对象的类型,仅进行身份检查。
建议的 pretty 方法是让ClassA,ClassB和ClassC都实现一个具有doStuff
成员的接口,然后执行以下操作:
currentState.doStuff()
如果不可能,则返回到if
序列。
答案 1 :(得分:1)
您不能使用与Kotlin中相同的语法,但可以使用 Freezed 。
https://pub.dev/packages/freezed
它允许您使用类似的语法。
考虑此模型:
@freezed
abstract class Model with _$Model {
factory Model.first(String a) = First;
factory Model.second(int b, bool c) = Second;
}
您可以通过以下方式使用when:
var model = Model.first('42');
print(
model.when(
first: (String a) => 'first $a',
second: (int b, bool c) => 'second $b $c'
),
); // first 42