flutter - 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 中不需要它,或者我做错了什么。
欢迎所有评论。
解决方案
不同的不是 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。此错误是由 中的方法引发ensureAssignable
的type_inferrer.dart
。isNonNullableByDefault
在该方法中,该属性有多种用途。其中之一使您的代码无效。
推荐阅读
- c# - 如何使用 c# API 授权 Azure Devops?
- hadoop - 如何在直线开始时删除 ADD jar 语句
- android - 如何更改 android compose TextFeild 的内容填充?
- java - 在 AsyncTask 中更新后自动/立即更新进度条
- postgresql - 来自 pg_range 和 pg_type 的查询不断占用我服务器的资源 - postgresql
- node.js - 将 cURL 命令转换为 JavaScript
- r - stringr 提取正则表达式未按预期工作
- android - 如何使用 Glide 获取网络图像的高度和宽度?
- database - 无法创建分片集合
- php - PHP和MySql,登录查询