Dart 给出未处理的异常:类型不是 'value' 类型的子类型

Dart gives Unhandled Exception: type is not a subtype of type of 'value'

我有一个摘要classImageUpdate。两个 classes,NewImageExistingImage 实现 ImageUpdate.

我有一个类型为 List<ImageUpdate> 的变量 imageUpdates

当我尝试将类型为 NewImage 的变量添加到列表时,出现此错误:

Unhandled Exception: type 'NewImage' is not a subtype of type 'ExistingImage' of 'value'

我很困惑,因为列表是 ImageUpdate 而不是 ExistingImage,所以我不知道如何调试它,特别是因为 Dart 是类型安全的(我没有在任何地方使用 dynamic).

如有任何帮助,我们将不胜感激。

我怀疑您的代码类似于:

class Base {}

class Derived1 extends Base {}

class Derived2 extends Base {}

List<Base> makeList() {
  var list = [Derived1()];
  return list;
}

void main() {
  var list = makeList();
  list.add(Derived2()); // TypeError
}

发生的情况是 List 对象最初创建为 List<Derived1>。 (也就是说,list.runtimeType 将类似于 List<Derived1>,而不是其 static(声明的)List<Base> 类型。)然后,当您尝试添加一个 Derived2 对象到 list,它将在运行时失败,因为 list 的实际运行时类型是 List<Derived1>,它不允许 Derived2 元素。

这最终源于 Dart 允许从 GenericClass<Derived>GenericClass<Base> 的隐式类型转换,如果 Derived 派生自 Base。这在很多情况下很有用,但也可能导致像这种情况在运行时失败。

您可以通过明确声明您想要一个 List<Base> 对象来解决此问题:

List<Base> makeList() {
  var list = <Base>[Derived1()]; // Note the explicit type.
  return list;
}

或者,如果这不可能,则通过创建一个新的 List<Base> 对象:

  • var list = <Base>[...makeList()];
  • var list = List<Base>.from(makeList());

(在这种特殊情况下,List.of(makeList()) 也可以工作,因为它会创建一个具有静态类型的新 List 对象,但我不会使用它,因为类型转换是明确的会更具可读性。)