在firestore
中,我有一个(简单)map
s的array
。
当将此数据放入Flutter/Dart
时,请使用cloud_firestore
包,如下所示:
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));
}
并按如下方式消费:
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
},
);
失败。
我找不到将此数组中的地图转换为法线地图的方法。 事实上,我几乎找不到任何关于LinkedMap
的信息.挖掘后,我在js
(https://pub.dev/packages/js) 包中看到它,但它在那里内部,不应该暴露。
如果我在firestore
有map
,它很容易转换为dart
Map<String, String>
。但是array
内的map
会像LinkedMap
一样到达.
我该如何LinkedMap
工作?我什至无法迭代它,因为即使我尝试导入js
,它在编译时也无法识别。
感谢
x[0]
类型是Map<String, dynamic>
。您正在尝试将其投射到Map<String, String>
,这显然会失败。 不过,您可以手动执行此操作:
final x = data['array_of_maps'] as List<Map<String, dynamic>>;
final myMap = x[0].map((key, value) => MapEntry(key, value.toString()));
我让它按照这个答案工作: 如何将 Firestore 中的地图数组转换为地图飞镖列表
基本上是使用内部map
的class
而不是通用Map
。