我正在尝试检索喜欢评论的所有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();
}
}
任何帮助将不胜感激。
答案 0 :(得分:1)
该错误消息告诉您snapshot.data
返回QuerySnapshot对象,但是您正试图将其传递给以DocumentSnapshot作为参数的函数。它们不兼容。 QuerySnapshot表示可以返回零个或多个文档的查询结果。 DocumentSnapshot表示单个文档。
如果要处理此查询的结果,则必须迭代QuerySnapshot中的文档并分别处理它们。 documentation中有一个示例:
querySnapshot.docs.forEach((doc) {
print(doc["first_name"]);
});
如果查询可以返回多个用户文档,则必须迭代结果并决定如何处理每个文档。如果您要将每个DocumentSnapshot传递给User.fromDocument()
,则会进行编译(但是我不知道它是否会满足您的要求,因为我们无法从查询中看到数据)。