In firestore
, I have an array
of (simple) map
s.
When getting this data into Flutter/Dart
, using the cloud_firestore
package as follows:
Stream<T> documentStream<T>({
required String path,
required T Function(Map<String, dynamic>? data, String documentID) builder})
{
final DocumentReference<Map<String, dynamic>> reference =
FirebaseFirestore.instance.doc(path);
final Stream<DocumentSnapshot<Map<String, dynamic>>> snapshots =
reference.snapshots();
return snapshots.map((snapshot) => builder(snapshot.data(), snapshot.id));
}
and consuming this e.g. as follows:
documentStream(
path: 'firestore_path_doc',
builder: (data, documentId) {
final x = data['array_of_maps'];
print(x[0].runtimeType); // gives LinkedMap<String, dynamic>
final y = x as List<Map<String, String>>; // fails
final y1 = x[0] as Map<String, String>; // fails
},
);
fails.
I cannot find a way to convert the map inside this array to a normal map.
In fact, I can barely find any info on LinkedMap
. After digging, I see its in the js
(https://pub.dev/packages/js) package, but it's internal there, not supposed to be exposed.
If I had a map
in firestore
, it converts easily to a Map<String, String>
in dart
. But a map
inside an array
arrives as a LinkedMap
.
How can I work this LinkedMap
? I cannot even iterate over it, since it is not recognised at compile time, even if I try to import js
.
thx
CodePudding user response:
x[0]
type is Map<String, dynamic>
. You're trying to cast it to Map<String, String>
, which would obviously fail.
You can do that manually though:
final x = data['array_of_maps'] as List<Map<String, dynamic>>;
final myMap = x[0].map((key, value) => MapEntry(key, value.toString()));
CodePudding user response:
I got it to work following the answer to this: How to convert an array of map in Firestore to a List of map Dart
Basically by using a class
for the inner map
instead of a generic Map
.