【发布时间】:2021-05-22 03:10:05
【问题描述】:
我在网上找到了一些类似的解决方案,但我无法让它与我的代码一起使用。
我认为问题出在 async/await 和 forEach 循环上,但我无法修复它。基本上,下面的代码不会将用户添加到 usersList 中,而是会相应地打印每个 if 块的调试行。
Stream<List<AppUser>> showSuggestionStream() {
List<AppUser> usersList = [];
return _firestore.collection('users').snapshots().map((snap) {
snap.docs.forEach((u) async {
final user = u.data();
final friendsCollection =
await u.reference.collection('friends').doc(uid).get();
if (friendsCollection.exists) {
if (friendsCollection.data()['status'] == 'accepted') {
print(
'FriendsCollection exist and we are friends, no need to add to usersList');
} else {
print('FriendsCollection exist and we are not friends');
usersList.add(AppUser(
uid: u.id,
displayName: user['name'],
email: user['email'],
photoUrl: user['photoUrl'],
phoneNumber: user['phoneNumber'],
providerData: user['providerData'],
));
}
} else {
print('No friends collection');
usersList.add(AppUser(
uid: u.id,
displayName: user['name'],
email: user['email'],
photoUrl: user['photoUrl'],
phoneNumber: user['phoneNumber'],
providerData: user['providerData'],
));
}
});
return usersList.toList();
});
}
编辑:
我考虑了更多,并决定尝试不同的方式。我正在远离 async/await,希望这是正确的方式。
但仍然无法让朋友的子集工作。我不确定如何将Future<List<Friend>> 转换为List<Friend>。
Stream<List<AppUser>> searchUsersStream() {
return _firestore
.collection('users')
.snapshots()
.map((snap) => snap.docs
.map((doc) => AppUser(
uid: doc.id,
displayName: doc.data()['name'],
email: doc.data()['email'],
phoneNumber: doc.data()['phoneNumber'],
photoUrl: doc.data()['photoUrl'],
providerData: doc.data()['providerData'],
// friends: doc.reference
// .collection('friends')
// .doc(uid)
// .snapshots()
// .map((doc) => Friend(userId: doc.id, name: doc.name))
// .toList()
))
.toList());
}
【问题讨论】:
-
“我认为问题在于 async/await 和 forEach 循环” - 将
snap.docs.forEach(...)替换为“正常”for (var doc in snap.docs) {...,以及使用的map方法是什么因为它的回调总是返回usersList.toList()? -
谢谢@pskink,但是当我尝试更改为“正常”时,我必须将异步移动到这一行:
_firestore.collection('users').snapshots().map((snap) async {。然后我得到错误:参数类型'Future- > Function(QuerySnapshot)' 不能分配给参数类型'List
Function(QuerySnapshot)'。 -
@pskink 用于
map方法,这是第一次,我这样尝试,因为我在网上看到一些代码可以做到这一点。我应该删除地图方法吗?我对 Flutter/dart 还是很陌生。 -
这就是我问
map的原因——你需要两个for循环,外部:for (var snap in _firestore.collection('users').snapshots())和内部:for (var doc in snap.docs) -
从不将
Iterable.forEach与async回调一起使用。见[dart]flutter how to wait map.forEach to complete in Future<void> function?
标签: firebase flutter dart google-cloud-firestore