尝试从我的收藏中获取阵列数据时遇到问题

时间:2020-11-12 00:55:20

标签: firebase flutter dart google-cloud-firestore stream-builder

我正在尝试检索喜欢评论的所有uid,以在页面上显示人员列表。我在使用StreamBuilder查询此数据时遇到问题。我已经尝试过很多不同的方法,但是在这里我没有任何运气。在此之前,我遇到了其他错误或根本没有数据。谁能帮我解决这个问题?

这是数据库路径 / comments / 411f47a0-8404-4800-a32e-35c260d7b670 / comments / 3ygnNwXM3WQlmoNDV6Ac

所以comments / postId / comments /,然后评论数据就在这里,其中包含每个uid的“ likers”数组

现在,我遇到此错误。它指向返回的StreamBuilder行。

type 'QuerySnapshot' is not a subtype of type 'DocumentSnapshot'

这是我具有StreamBuilder的小部件。

@override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Firestore.instance
            .collection("comments")
            .document(widget.postId)
            .collection("comments")
            .where("likers", arrayContains: widget.uid)
            .snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            var user = User.fromDocument(snapshot.data);
            return Padding(
              padding: const EdgeInsets.only(top: 5.0, left: 5.0, right: 5.0),
              child: ClipRRect(
                borderRadius: BorderRadius.circular(15.0),
                child: Card(
                  child: ListTile(
                    tileColor: R.colors.grey200,
                    leading: user.photoUrl.isNotEmpty
                        ? CachedNetworkImage(
                            placeholder: (context, url) => CircleAvatar(
                              backgroundColor: R.colors.grey,
                              radius: 25.0,
                            ),
                            imageUrl: user.photoUrl,
                            width: 50.0,
                            height: 50.0,
                            fit: BoxFit.cover,
                          )
                        : Icon(
                            Icons.account_circle,
                            size: 50.0,
                            color: R.colors.grey,
                          ),
                    title: Text(
                      (user.username),
                      style: TextStyle(
                          color: R.colors.black, fontWeight: FontWeight.bold),
                    ),
                    subtitle: Text(
                      (user.profileName),
                      style: TextStyle(color: R.colors.black),
                    ),
                    trailing: FlatButton(
                        color: R.colors.blueAccent,
                        shape: RoundedRectangleBorder(
                            borderRadius:
                                BorderRadius.all(Radius.circular(25.0))),
                        clipBehavior: Clip.hardEdge,
                        onPressed: () {
                          if (!following) {
                            controlFollowUser();
                          } else {
                            controlUnfollowUser();
                          }
                        },
                        child: Text(following
                            //currentUser.following.contains(user.id)
                            ? "Unfollow"
                            : "Follow")),
                  ),
                ),
              ),
            );
          } else {
            return ListTile(
              title: Text("Nothing here"),
            );
          }
        });
  }

此行正在获取用户数据(例如用户名和个人资料图片),并且能够获取该数据,因为它可以从查询的注释数据中获取正确的uid。这是它的起源。

var user = User.fromDocument(snapshot.data);

factory User.fromDocument(DocumentSnapshot doc) {
    if (doc != null) {
      return User(
        following: doc['following']?.cast<String>() ?? [],
        followers: doc['followers']?.cast<String>() ?? [],
        id: doc.documentID,
        email: doc['email'] ?? "",
        username: doc['username'],
        photoUrl: doc['photoUrl'],
        url: doc['photoUrl'],
        profileName: doc['profileName'],
        bio: doc['bio'],
        createdAt: doc['createdAt'],
        talkingTo: doc['talkingTo'],
        receiverName: doc['receiverName'],
      );
    } else {
      return new User();
    }
  }

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

该错误消息告诉您snapshot.data返回QuerySnapshot对象,但是您正试图将其传递给以DocumentSnapshot作为参数的函数。它们不兼容。 QuerySnapshot表示可以返回零个或多个文档的查询结果。 DocumentSnapshot表示单个文档。

如果要处理此查询的结果,则必须迭代QuerySnapshot中的文档并分别处理它们。 documentation中有一个示例:

        querySnapshot.docs.forEach((doc) {
            print(doc["first_name"]);
        });

如果查询可以返回多个用户文档,则必须迭代结果并决定如何处理每个文档。如果您要将每个DocumentSnapshot传递给User.fromDocument(),则会进行编译(但是我不知道它是否会满足您的要求,因为我们无法从查询中看到数据)。