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
属性 有多种用途。其中之一会使您的代码无效。
我正在从 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
属性 有多种用途。其中之一会使您的代码无效。