'How to cast <dynamic> to List<String>?

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



Solution 1:[1]

Easier answer and as far as I am aware also the suggested way.

List<String> categoriesList = List<String>.from(map['categories'] as List);

Note the "as List" is probably not even needed.

Solution 2:[2]

Easy Answer:

You can use the spread operator, like [...json["data"]].

Full example:

final Map<dynamic, dynamic> json = {
  "name": "alice",
  "data": ["foo", "bar", "baz"],
};

// method 1, cast while mapping:
final data1 = (json["data"] as List)?.map((e) => e as String)?.toList();
print("method 1 prints: $data1");

// method 2, use spread operator:
final data2 = [...json["data"]];
print("method 2 prints: $data2");

Output:

flutter: method 1 prints: [foo, bar, baz]
flutter: method 2 prints: [foo, bar, baz]

Solution 3:[3]

final list = List<String>.from(await value.get("paymentCycle"));

I have use this when i am getting data from Firebase

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Terblanche Daniel
Solution 2
Solution 3 Vikash Kumar