Json 类型';列表<;动态>';不是类型为';列表<;int>';哪里

Json 类型';列表<;动态>';不是类型为';列表<;int>';哪里,json,list,flutter,dart,dynamic,Json,List,Flutter,Dart,Dynamic,我是一个新手,我尝试运行一个GitHub项目,但遇到了一个错误,比如类型ListDynamic不是类型ListInt的子类型 错误行 List<int> genreIds; MediaItem._internalFromJson(Map jsonMap, {MediaType type: MediaType.movie}) : type = type, id = jsonMap["id"].toInt(),

我是一个新手,我尝试运行一个GitHub项目,但遇到了一个错误,比如类型ListDynamic不是类型ListInt的子类型

错误行

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


}
列出genreid;
MediaItem.\u internalFromJson(映射jsonMap,{MediaType类型:MediaType.movie})
:
类型=类型,
id=jsonMap[“id”].toInt(),
voteAverage=jsonMap[“投票平均值”]。toDouble(),
title=jsonMap[(type==MediaType.movie?“title”:“name”)],
posterPath=jsonMap[“海报路径”]??"",
backdropPath=jsonMap[“background_path”]??"",
overview=jsonMap[“overview”],
releaseDate=jsonMap[(type==MediaType.movie
?发布日期
:“首航日期”)],
genreIds=jsonMap[“流派id”]//在这一行
}

如有任何帮助,我们将不胜感激,请提前感谢。

更改

genreIds = jsonMap["genre_ids"];

genreIds=jsonMap[“流派ID”].cast();
JSON映射或列表中的类型没有具体的泛型类型。
genreIds
需要一个
列表
而不是
列表
(或
列表
),因此您需要将该值设置为所需类型,然后才能分配它


如果您之前没有在同一代码中看到此错误,那么可能是因为您升级到了Dart版本,其中
--preview-Dart-2
成为默认版本(以前是选择加入的)

一种更优雅的方法也可以是初始化新列表,而不是强制转换

var genreIdsFromJson = jsonMap['genre_ids'];
List<int> genreIdsList = new List<int>.from(genreIdsFromJson);

// then you can use gendreIdsList to the mapping function
// ...

gendreIds = genreIdsList
...
var genreIdsFromJson=jsonMap['genre_id'];
List genreIdsList=new List.from(genreIdsFromJson);
//然后可以使用gendreIdsList来创建映射函数
// ...
gendreIds=genreidlist
...
更新:

`` 所有元素都应该是E的实例。元素iterable本身可能有任何元素类型,因此此构造函数可用于向下转换列表,例如:

List<SuperType> superList = ...;
List<SubType> subList =
    new List<SubType>.from(superList.whereType<SubType>());
List superList=。。。;
列表子列表=
新的List.from(superList.whereType());
当可增长为true时,此构造函数创建可增长列表;否则,它将返回一个固定长度的列表。 ``

更新:为什么初始化比强制转换更好?(赞成/反对)

显式转换(强制转换):该过程通常与信息丢失或无法在类型之间转换有关

创建新的不可变元素比强制转换要好。在编译时显示与类型相关的错误,可读性更强的代码,可维护性更强的代码,更好的提前(AOT)编译


i、 最好尝试解析或使用预定义的方法解析一个值,因为如果类型不匹配,该值将为null。另一方面,显式强制转换对象或值可能会在运行时抛出错误。

较短的处理方法是

genreIds = (jsonMap["genre_ids"] as List)?.map((e) => e as int)?.toList();

我用
演员阵容(
)做了建议的事情,并且在一段时间内效果很好。虽然我遇到了一个错误,如果映射中键的值为null(例如,找不到并抛出了错误)

要解决此问题,您可以执行一个丑陋的内联空检查:

下面是一种更干净、更省力的方法,它是使用空感知的
?。
操作符:

尝试执行此操作(此类型转换修复并修复了
null
问题):

genreIds=jsonMap[“流派ID”]?.cast()
而不是

genreIds = jsonMap["genre_ids"].cast<int>();
genreIds=jsonMap[“流派ID”].cast();

这仍然有效吗?列表
cast
中的cast函数似乎并不存在很短时间。有关更多详细信息,请参阅。@GünterZöchbauer如果cast只存在很短的时间,现在应该使用什么?在我的例子中,我试图将列表转换为列表,而“as”不起作用,仍然必须使用“.cast”?您是否在您的评论之前查看了我评论中的链接?也许
新列表(myDynamicList)
每天我都在搜索与颤振/飞镖相关的东西,我对您的答案有了更好的理解,先生。非常感谢。与@paresh的答案相关,我们可以使用空感知操作符,例如:
genreIds=jsonMap[“genre_id”]?.cast()
甚至List.from(genreIdsFromJson???[])要处理映射的“genre_id”键没有元素时的情况,可以从(genreIdsFromJson)方法向方法添加一些验证。根据具体情况,您可以在返回相应对象之前进行检查,也可以使用内联条件返回默认值(可能为null/空字符串),例如FooType.from(json['genreIdsFromJson'])?FooType.from(json['genreIdsFromJson']):null。这是一个非常有趣的答案,您介意添加与cast相比的优点/缺点吗?谢谢
genreIds = jsonMap["genre_ids"]?.cast<int>()
genreIds = jsonMap["genre_ids"].cast<int>();