[Solved] How to cast <dynamic> to List<String>?


Asked by ggutenberg on February 07, 2020 (source).

I have a record class to parse objects coming from Firestore. A stripped down version of my class looks like:

class BusinessRecord {
  BusinessRecord.fromMap(Map<String, dynamic> map, {this.reference})
      : assert(map['name'] != null),
        name = map['name'] as String,
        categories = map['categories'] as List<String>;

  BusinessRecord.fromSnapshot(DocumentSnapshot snapshot)
      : this.fromMap(snapshot.data, reference: snapshot.reference);

  final String name;
  final DocumentReference reference;
  final List<String> categories;

This compiles fine, but when it runs I get a runtime error:

type List<dynamic> is not a subtype of type 'List<String>' in type cast

If I just use categories = map['categories']; I get a compile error: The initializer type 'dynamic' can't be assigned to the field type 'List<String>'.

categories on my Firestore object is a List of strings. How do I properly cast this?

Edit: Following is what the exception looks like when I use the code that actually compiles:

VSCode Exception


Question answered by Hian (source).

Imho, you shouldn't cast the list, instead cast its children one by one, for example:


categories = (map['categories'] as List)?.map((item) => item as String)?.toList();

enter image description here