类型'List <dynamic>'不是'List <int>'类型的子类型

Mag*_*ian 18 dart flutter

我是Flutter的新手,我尝试运行一个github项目,但得到类似List动态的错误不是List int where类型的子类型.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


}
Run Code Online (Sandbox Code Playgroud)

上面的代码文件

任何帮助将不胜感激,谢谢你提前.

Edi*_*Edi 32

一种更优雅的方式也可以是初始化新的 List 而不是强制转换。

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

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

gendreIds = genreIdsList
...
Run Code Online (Sandbox Code Playgroud)

更新: 根据文档

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

List<SuperType> superList = ...;
List<SubType> subList =
    new List<SubType>.from(superList.whereType<SubType>());
Run Code Online (Sandbox Code Playgroud)

当growable 为true 时,此构造函数创建一个可增长列表;否则,它返回一个固定长度的列表。``

更新:为什么初始化比投射更好?(优点缺点)

显式转换(Casting):该过程通常与信息丢失或类型之间转换失败有关

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

即最好尝试使用预定义的方法解析或解析值,因为如果类型不匹配,则该值将为空。另一方面,显式转换对象或值可能会在运行时引发错误。


Gün*_*uer 31

更改

genreIds = jsonMap["genre_ids"];
Run Code Online (Sandbox Code Playgroud)

genreIds = jsonMap["genre_ids"].cast<int>();
Run Code Online (Sandbox Code Playgroud)

JSON映射或列表中的类型没有具体的泛型类型. genreIds要求List<int>不是List(或List<dynamic>),因此您需要在分配之前将值带到所需类型.

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

  • `cast` 只存在了很短的时间。有关更多详细信息,请参阅 https://github.com/dart-lang/site-www/issues/736。 (3认同)
  • 这仍然有效吗?List&lt;dynamic&gt; 中似乎没有强制转换函数 (2认同)

thi*_*yen 9

更短的处理方法是

genreIds = (jsonMap["genre_ids"] as List)?.map((e) => e as int)?.toList();
Run Code Online (Sandbox Code Playgroud)


kri*_*yaa 8

给出所有的解决方案。我想添加许多其他不同的方法来实现相同的目标

  1. List<int> genreIds = List<int>.from(source);
  2. List<int> ints = List.castFrom<dynamic, int>(source);
  3. List<int> ints = source.cast<int>();
  4. List<int> ints = source.map((e) => e as int).toList();

对于这个用例,您可以编写:

List<int> genreIds = List<int>.from(jsonMap["genre_ids"]);

希望能帮助到你!:)