首页 > 解决方案 > Flutter 2.5.0,将父类转换为子类失败(在 1.22.6 中可以)

问题描述

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

在我的代码中,我有一个返回基类对象的插件 API:

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 中不需要它,或者我做错了什么。

欢迎所有评论。

标签: flutterdartinheritancecasting

解决方案


不同的不是 Flutter 或 Dart 版本,而是pubspec.yaml文件中的最低 Dart 版本。

使用 2.11.0 的最低 Dart 版本,您的代码也可以使用 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,“默认情况下不可为空”会自动激活。

您得到的错误是使用templateInvalidAssignmentError。此错误是由 中的方法引发ensureAssignabletype_inferrer.dartisNonNullableByDefault在该方法中,该属性有多种用途。其中之一使您的代码无效。


推荐阅读