我正在将Flutter与Cloud Firestore一起使用来构建聊天应用程序,我希望用户列表中包含最新消息
我在Google上搜索了一下,找到了如何在两个集合之间建立链接并创建另一个列表
await Firestore.instance
.collection('users')
.getDocuments()
.then((results) {
List<Users> users = [];
results.documents.forEach((doc) {
Users user = new Users();
String id = doc.data['id'];
if (id.hashCode <= currentUserId.hashCode) {
groupChatId = '$id-$currentUserId';
} else {
groupChatId = '$currentUserId-$id';
}
user.Id = doc.data['id'];
user.Name = doc.data['name'];
Firestore.instance
.collection('messages')
.document(groupChatId)
.collection(groupChatId)
.getDocuments()
.then((m) {
if (m.documents.length > 0) {
user.LastMessage = m.documents.first.data['content'];
}
});
print(user.LastMessage);
users.add(user);
});
setState(() {
_users = users;
});
});
当我打印user.LastMessage返回null,但_users包含所有信息,但_users列表中有消息。
答案 0 :(得分:2)
怀疑,我没有测试:
在第二个then
处理程序中,您正在获取最后一条消息,但是到它到达时,该块已完成执行,而您不必等待它返回。
也许尝试这样:
void _fetch() async {
// Wait for all documents to arrive, first.
final result = await Firestore.instance
.collection('users')
.getDocuments();
List<Users> users = [];
results.documents.forEach((doc) {
Users user = new Users();
String id = doc.data['id'];
if (id.hashCode <= currentUserId.hashCode) {
groupChatId = '$id-$currentUserId';
} else {
groupChatId = '$currentUserId-$id';
}
user.Id = doc.data['id'];
user.Name = doc.data['name'];
// Wait for each single message to arrive
final m = await Firestore.instance
.collection('messages')
.document(groupChatId)
.collection(groupChatId)
.getDocuments();
if (m.documents.length > 0) {
user.LastMessage = m.documents.first.data['content'];
}
print(user.LastMessage);
users.add(user);
});
setState(() {
_users = users;
});
}
但是,请注意,如果您有很多对话,则这种方法效率不高。
您可以考虑使用Future.wait(您需要将onEach
替换为返回期货的map
)。