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:
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.
Imho, you shouldn't cast the list, instead cast its children one by one, for example:
UPDATE
...
...
categories = (map['categories'] as List)?.map((item) => item as String)?.toList();
...
...
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]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With