首页 > 解决方案 > Dart 2.12 中以前使用带有 runtimeType 的 switch 的可能性是什么?

问题描述

我曾经在 Flutter 2.0 / Dart 2.12 之前能够做到:

return BlocBuilder<MediaBloc, MediaState>(builder: (context, videoState) {
  switch (videoState.runtimeType) {
    case ReadyVideoState:
      return buildVideoWidget(context, videoState);
    default:
      throw ArgumentError.value(videoState);
  }
});

调用带有签名的函数:

Widget buildVideoWidget(
    BuildContext context, ReadyVideoState readyVideoState) {

现在,我得到了错误:

The argument type 'MediaState' can't be assigned to the parameter type 'ReadyVideoState'.

ReadyVideoState是 的子类MediaState。编译器现在抱怨这个调用并说它不起作用,因为 videoState 的类型是 MediaState 而不是 ReadyVideoState。有没有新的成语来表达我想表达的?

标签: flutterdart

解决方案


除了调试之外,您永远不应该使用runtimeType它。问题是它总是只返回对象的特定类型,并没有告诉我们这个对象是否与给定的接口兼容。因此,如果您有一个从它延伸的对象,ReadyVideoState则不会ReadyVideoState查看runtimeType该对象。这很少是你想要的。

相反,您应该始终使用 eg if (videoState is ReadyVideoState)。这实际上将检查videoState是否与类型兼容,ReadyVideoState因此适用于实现/扩展的对象ReadyVideoState

是的,不幸的是,这意味着您不能使用开关进行类型识别,因此在某些情况下您需要大量else if (...).


推荐阅读