Flutter中如何重新映射Firestore数据并添加额外属性
在Flutter中给Firestore获取的数据添加id属性
当然可以实现,问题出在你使用map的方式可能没正确结合Firestore文档的id字段。Firestore的每个文档快照(DocumentSnapshot)本身就带有id属性,你只需要在映射的时候把这个id合并到数据里即可。
正确的实现方式
假设你从Firestore的某个集合获取数据,直接在遍历文档快照时添加id:
// 获取Firestore集合的快照 QuerySnapshot snapshot = await FirebaseFirestore.instance.collection('your_collection_name').get(); // 映射数据并添加id字段 List<Map<String, dynamic>> resultList = snapshot.docs.map((doc) { // 展开原数据并添加id,创建新的Map(推荐,不修改原数据) return { ...doc.data() as Map<String, dynamic>, 'id': doc.id, }; }).toList();
如果你需要修改原数据对象(而非创建新对象),也可以这样写:
List<Map<String, dynamic>> resultList = snapshot.docs.map((doc) { Map<String, dynamic> data = doc.data() as Map<String, dynamic>; data['id'] = doc.id; return data; }).toList();
如果你已经有了不带id的原始列表
如果因为某些原因你已经拿到了不带id的列表,同时有对应的id列表,也可以通过索引对应添加:
// 原始数据列表 List<Map<String, dynamic>> originalData = [ {"name":"john","age":12}, {"name":"wick","age":12} ]; // 对应的id列表 List<String> ids = ["xxx", "yyy"]; // 映射添加id List<Map<String, dynamic>> resultList = List.generate(originalData.length, (index) { return { ...originalData[index], 'id': ids[index], }; });
常见错误点
- 忘记调用
.toList():map方法返回的是Iterable,需要转成List才能使用 - 没正确获取Firestore文档的id:直接操作数据列表而忽略了
DocumentSnapshot的id属性 - 尝试修改不可变的Map:Firestore返回的数据如果是不可变类型,直接修改会报错,这时候用展开运算符创建新Map更稳妥
内容的提问来源于stack exchange,提问作者Oscar Chua Wei Wen
相关产品推荐
相关产品推荐

