我如何在 Stream-Builder 中使用两个依赖的异步任务?
How can i use two dependent async tasks in a Stream-Builder?
我想将 StreamBuilder
用于两个异步任务。第一个异步流从 Firebase/Firestore 获取打开的好友请求。对于每个 friend_request
项目,我需要第二个异步任务,它获取 friend_request
项目的配置文件信息。
问题是,我无法使用 StreamBuilder
中的第二个异步任务,因为构建器不能是 asnc。我当前的代码 returns 列表太早了,因为它不能等待。
我很乐意得到帮助。
StreamBuilder<QuerySnapshot>(
stream: firestoreHandler.streamRequestedFriends(),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.docs.isEmpty)
return Text('No friend requests');
List<FriendRequestItem> friendList = List<FriendRequestItem>();
var friendRequests = snapshot.data.docs;
for (var friendRequest in friendRequests) {
String friendId = friendRequest.data()['friendId'];
// firestoreHandler.getUserById() needs to await
firestoreHandler
.getUserById(friendId)
.then((friendProfile) {
friendList.add(
FriendRequestItem(
photoUrl: friendProfile.data()['profile_picture'],
email: friendProfile.data()['email'],
onAccept: () {
firestoreHandler.acceptFriendRequest(friendId);
},
onDelete: () {
firestoreHandler.removeFriendRequest(friendId);
},
),
);
});
}
return Column(
children: friendList,
);
},
),
为此,您必须在 StreamBuilder 中使用 FutureBuilder。
StreamBuilder<QuerySnapshot>(
stream: firestoreHandler.streamRequestedFriends(),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.docs.isEmpty)
return Text('No friend requests');
List<FriendRequestItem> friendList = List<FriendRequestItem>();
var friendRequests = snapshot.data.docs;
for (var friendRequest in friendRequests) {
String friendId = friendRequest.data()['friendId'];
return FutureBuilder(
future: firestoreHandler.getUserById(friendId),
builder: (context, snapshotFuture) {
if (snapshot.connetionState == ConnectionState.done) {
friendList.add(
FriendRequestItem(
photoUrl: snapshotFuture.data.data()['profile_picture'],
email: snapshotFuture.data.data()['email'],
onAccept: () {
firestoreHandler.acceptFriendRequest(friendId);
},
onDelete: () {
firestoreHandler.removeFriendRequest(friendId);
},
),
);
return Column(
children: friendList,
);
}
return CircularProgressIndicator();
},
);
}
},
);
我想将 StreamBuilder
用于两个异步任务。第一个异步流从 Firebase/Firestore 获取打开的好友请求。对于每个 friend_request
项目,我需要第二个异步任务,它获取 friend_request
项目的配置文件信息。
问题是,我无法使用 StreamBuilder
中的第二个异步任务,因为构建器不能是 asnc。我当前的代码 returns 列表太早了,因为它不能等待。
我很乐意得到帮助。
StreamBuilder<QuerySnapshot>(
stream: firestoreHandler.streamRequestedFriends(),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.docs.isEmpty)
return Text('No friend requests');
List<FriendRequestItem> friendList = List<FriendRequestItem>();
var friendRequests = snapshot.data.docs;
for (var friendRequest in friendRequests) {
String friendId = friendRequest.data()['friendId'];
// firestoreHandler.getUserById() needs to await
firestoreHandler
.getUserById(friendId)
.then((friendProfile) {
friendList.add(
FriendRequestItem(
photoUrl: friendProfile.data()['profile_picture'],
email: friendProfile.data()['email'],
onAccept: () {
firestoreHandler.acceptFriendRequest(friendId);
},
onDelete: () {
firestoreHandler.removeFriendRequest(friendId);
},
),
);
});
}
return Column(
children: friendList,
);
},
),
为此,您必须在 StreamBuilder 中使用 FutureBuilder。
StreamBuilder<QuerySnapshot>(
stream: firestoreHandler.streamRequestedFriends(),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.docs.isEmpty)
return Text('No friend requests');
List<FriendRequestItem> friendList = List<FriendRequestItem>();
var friendRequests = snapshot.data.docs;
for (var friendRequest in friendRequests) {
String friendId = friendRequest.data()['friendId'];
return FutureBuilder(
future: firestoreHandler.getUserById(friendId),
builder: (context, snapshotFuture) {
if (snapshot.connetionState == ConnectionState.done) {
friendList.add(
FriendRequestItem(
photoUrl: snapshotFuture.data.data()['profile_picture'],
email: snapshotFuture.data.data()['email'],
onAccept: () {
firestoreHandler.acceptFriendRequest(friendId);
},
onDelete: () {
firestoreHandler.removeFriendRequest(friendId);
},
),
);
return Column(
children: friendList,
);
}
return CircularProgressIndicator();
},
);
}
},
);