Flutter 2.5.0,将父项转换为子项 class 失败(在 1.22.6 中正常)

Flutter 2.5.0, casting parent to child class fails (ok in 1.22.6)

我正在从 Flutter 1.22.6 迁移到 2.5.0 (dart 2.14),对显式转换有疑问。

在我的代码中,我有一个插件 API returns 一个基础 class 对象:

Future<BaseData> getReport(String type) async {
  return BaseData.fromJson(json.decode(report))
}

BaseData.fromJson可以建立多个不同的子对象,像这样:

static BaseData fromJson(Map<String, dynamic> json) {
  switch (json['type'] as String) {
    case 'typeOne':
      return ChildDataOne.fromJson(json);
    case 'typeTwo':
      return ChildDataTwo.fromJson(json);
   etc

然后我这样调用插件函数:

ChildDataOne childDataTypeOne = await dataManager.getReport(String type)

并且在 Flutter 1.22.6 中这工作正常。返回一个 ChildDataOne 对象,因为 BaseData.fromJson 构造函数总是构建正确的子类型并且不需要显式转换。

然而,在 Flutter 2.5.0 中我得到:

A value of type 'BaseData' can't be assigned to a variable of type 'ChildDataOne'.

我当然可以将其转换为:

final childDataTypeOne = await dataManager.getReport() as ChildDataOne;

但我不清楚为什么在 Flutter 2.5.0 中需要它,而在 1.22.6 中不需要它,或者我是否以错误的方式做事。

欢迎所有评论。

造成差异的不是 Flutter 或 Dart 版本,而是 pubspec.yaml 文件中的最低 Dart 版本。

Dart 的最低版本为 2.11.0,您的代码也可以使用 Dart 2.14.0。

environment:
  sdk: ">=2.11.0 <3.0.0"

一旦您更改为最小版本 2.12.0,您的代码将无法编译。

environment:
  sdk: ">=2.12.0 <3.0.0"

如果您使用最低版本 2.12.0,“默认不可为空”会自动激活。

您得到的错误是在 type_inferrer.dart 中使用 templateInvalidAssignmentError. This error is raised by the method ensureAssignable。在该方法中,isNonNullableByDefault 属性 有多种用途。其中之一会使您的代码无效。