type 'List<dynamic>' is not a subtype of type 'List<int>' where type 'List<dynamic>' is not a subtype of type 'List<int>' where dart dart

type 'List<dynamic>' is not a subtype of type 'List<int>' where


Change

genreIds = jsonMap["genre_ids"];

to

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

types in JSON maps or lists don't have concrete generic types.genreIds requires a List<int> not a List (or List<dynamic>), therefore you need to bring the value to its required type before you can assign it.

If you haven't seen this error earlier for the same code, then it's probably because you upgraded to a Dart version where --preview-dart-2 became the default (it was opt-in previously)


A more elegant way could also be initialising new List instead of casting.

var genreIdsFromJson = jsonMap['genre_ids'];List<int> genreIdsList = new List<int>.from(genreIdsFromJson);// then you can use gendreIdsList to the mapping function// ...gendreIds = genreIdsList...

Update:As per the documentation

``All the elements should be instances of E. The elements iterable itself may have any element type, so this constructor can be used to down-cast a List, for example as:

List<SuperType> superList = ...;List<SubType> subList =    new List<SubType>.from(superList.whereType<SubType>());

This constructor creates a growable list when growable is true; otherwise, it returns a fixed-length list.``

Update: Why is it better to initialize than to cast? (Pros / Cons)

Explicit Conversions (Casting): The process is usually associated with information loss or failure to convert between types

Creating new immutable elements is better than casting. Revealing type-related bugs at compile time, more readable code, more maintainable code, better ahead of time (AOT) compilation.

i.e. it is better to try parse or parse a value with predefined method because if the type does not match the value will be null. On the other hand explicitly casting an object or value can throw errors at runtime.


I did what suggested with the cast<Type>() and it was working nicely for a while. Though I encountered an error where if the value for the key in the map was null (e.g. not found and threw the error)

To fix this you can make an ugly inline null check:

Here is The cleaner and more Dartful way of accomplishing this is with the null-aware ?. operator:

Try doing this (this typing cast fixes and also fixes the null problem):

genreIds = jsonMap["genre_ids"]?.cast<int>()

instead of

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