我可以在 Dart 的开关盒中使用“is”运算符吗?

Joe*_*röm 6 switch-statement dart

我觉得这是一个愚蠢的问题,但我无法让它发挥作用。

我拥有的:

if (current is classA){
   //do stuff
   return;
}
if (current is classB){
   //do stuff
   return;
}
if (current is classC){
   //do stuff
   return;
}
Run Code Online (Sandbox Code Playgroud)

我想要的是:

switch (currentState) {
   case is classA: { 
      //do stuff
      break;
   }
   case is classB: { 
      //do stuff
      break;
   }
   case is classC: { 
      //do stuff
      break;
   }
}
Run Code Online (Sandbox Code Playgroud)

我真正想要的(科特林):

When (currentState){
   is classA -> //do stuff
   is classB -> //do stuff
   is classC -> //do stuff
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我是否可以像 Kotlins When 运算符一样使用 Dart Switch,或者至少使用其他运算符 then == 来断言案例评估?

lrn*_*lrn 6

不。

Dart switch case 是一个非常低级的构造。它只允许不覆盖运算符的常量值表达式==(除了一些基本平台类型),因此可以使用identical检查有效地实现它。

没有能力进行复杂的检查,或检查对象的类型,只能进行身份检查。

推荐的漂亮方法是让 ClassA、ClassB 和 ClassC 都实现一个带有doStuff成员的接口,然后执行以下操作:

 currentState.doStuff()
Run Code Online (Sandbox Code Playgroud)

如果这是不可能的,您将返回到if序列。

  • 好的,我在颤动中使用 BLoC 模式,并且必须检查正在接收女巫状态。每个状态扩展 MyBlocState 并确定要构建的 Widget-tree。根据您的回答判断,在这种情况下无法使用 switch 语句。感谢您的回答,如果我解释错误,请纠正我。 (2认同)

And*_*hko 6

switch (runtimeType) {
   case ClassA: //do stuff 
      return;
   case ClassB: //do stuff
      return;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最有帮助的答案 `switch (state.runtimeType) { ... }` (2认同)

Raf*_*809 5

您不能使用与 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;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式使用when:

var model = Model.first('42');

print(
  model.when(
    first: (String a) => 'first $a',
    second: (int b, bool c) => 'second $b $c'
  ),
); // first 42
Run Code Online (Sandbox Code Playgroud)