我如何在 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();
          },
        );
      }
    },
  );