我是Flutter的新手,我尝试运行一个GitHub项目,但出现了如下错误:
类型List dynamic不是类型List int的子类型,其中。
Github Link
错误行
List<int> genreIds;
MediaItem._internalFromJson(Map jsonMap, {MediaType type: MediaType.movie})
:
type = type,
id = jsonMap["id"].toInt(),
voteAverage = jsonMap["vote_average"].toDouble(),
title = jsonMap[(type == MediaType.movie ? "title" : "name")],
posterPath = jsonMap["poster_path"] ?? "",
backdropPath = jsonMap["backdrop_path"] ?? "",
overview = jsonMap["overview"],
releaseDate = jsonMap[(type == MediaType.movie
? "release_date"
: "first_air_date")],
genreIds = jsonMap["genre_ids"];//in this line
}
7条答案
按热度按时间zzlelutf1#
变更
到
JSONMap或列表中的类型没有具体的泛型类型。
genreIds
需要List<int>
,而不是List
(或List<dynamic>
),因此在赋值之前,需要将值转换为所需的类型。如果您之前没有在相同代码中看到此错误,则可能是因为您升级到了Dart版本,其中
--preview-dart-2
成为默认值(之前是选择加入的)fzwojiic2#
一个更优雅的方法也可以是初始化新的List而不是强制转换。
更新:As per the documentation
''所有的元素都应该是E的示例。可迭代的元素本身可以有任何元素类型,所以这个构造函数可以用来向下转换List,例如:
此构造函数在growable为true时创建可增长列表;否则,它返回一个固定长度的列表。
更新:为什么初始化比强制转换更好?(优点/缺点)
显式转换(强制转换):该过程通常与信息丢失或无法在类型之间转换有关
创建新的不可变元素比强制转换好。在编译时发现与类型相关的错误,代码更可读,代码更易维护,更好的提前(AOT)编译。
也就是说,最好尝试解析或使用预定义方法解析值,因为如果类型不匹配,则值将为null。另一方面,显式强制转换对象或值可能会在运行时引发错误。
cgfeq70w3#
一个更简短的处理方法是
ilmyapht4#
如果你仍然像我一样不成功,试试:
第一个月
mxg2im7a5#
我遇到这个问题是因为我在API库中使用了泛型,下面是我的解决方法:
clj7thdc6#
考虑到所有的解决方案。我想补充许多其他不同的方法来实现同样的目标。
1.第一个月
List<int> ints = List.castFrom<dynamic, int>(source);
List<int> ints = source.cast<int>();
List<int> ints = source.map((e) => e as int).toList();
对于此用例,您可以编写:
List<int> genreIds = List<int>.from(jsonMap["genre_ids"]);
希望有帮助!:)
oug3syen7#
我在使用json设置属性时遇到了类似的错误,我用以下代码修复了它:
它们是单一属性,因此0始终是正确的。