我正在尝试从名为"posts"的Firestore集合中检索帖子,其中包含 post creator's userID 和帖子说明,这可以通过使用StreamBuilder和FutureBuilder实现(不可取,因为它只获取一次快照,并且在字段时不会更新变化) .
但是,我想使用 post creator's userID 查询另一个名为"users"的集合,并检索与userId匹配的文档 .
这是我的第一个方法:
StreamBuilder<QuerySnapshot>(
stream:Firestore.instance.collection("posts").snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) {
return Center(
child: _showProgressBar,
);
}
List<DocumentSnapshot> reversedDocuments = snapshot.data.documents.reversed.toList();
return ListView.builder(
itemCount: reversedDocuments.length,
itemBuilder: (BuildContext context, int index){
String postAuthorID = reversedDocuments[index].data["postAuthorID"].toString();
String postAuthorName = '';
Firestore.instance.collection("users")
.where("userID", isEqualTo: postAuthorID).snapshots().listen((dataSnapshot) {
print(postAuthorName = dataSnapshot.documents[0].data["username"]);
setState(() {
postAuthorName = dataSnapshot.documents[0].data["username"];
});
});
String desc = reversedDocuments[index].data["post_desc"].toString();
return new ListTile(
title: Container(
child: Row(
children: <Widget>[
Expanded(
child: Card(
child: new Column(
children: <Widget>[
ListTile(
title: Text(postAuthorName, //Here, the value is not changed, it holds empty space.
style: TextStyle(
fontSize: 20.0,
),
),
subtitle: Text(desc),
),
)
在了解ListView.builder()只能基于DocumentSnapshot列表呈现项目并且无法处理构建器内的查询之后 .
After many research: 我尝试了许多替代方案,尝试在initState()中构建列表,尝试使用嵌套流构建器:
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('posts').snapshots(),
builder: (context, snapshot1){
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection("users").snapshots(),
builder: (context, snapshot2){
return ListView.builder(
itemCount: snapshot1.data.documents.length,
itemBuilder: (context, index){
String desc = snapshot1.data.documents[index].data['post_description'].toString();
String taskAuthorID = snapshot1.data.documents[index].data['post_authorID'].toString();
var usersMap = snapshot2.data.documents.asMap();
String authorName;
username.forEach((len, snap){
print("Position: $len, Data: ${snap.data["username"]}");
if(snap.documentID == post_AuthorID){
authorName = snap.data["username"].toString();
}
});
return ListTile(
title: Text(desc),
subtitle: Text(authorName), //Crashes here...
);
},
);
}
);
}
);
尝试使用Stream Group并且无法找到完成此操作的方法,因为它只组合了两个流,但我希望第二个流可以从第一个流中获取值 .
这是我的Firebase Collection截图:
Firestore "posts" collection:
Firestore "users"系列:
我知道这是一件非常简单的事情,但仍然找不到任何教程或文章来实现这一点 .
2 回答
我发布了一个类似的问题,后来找到了一个解决方案:让itemBuilder返回状态的小部件并在其中使用FutureBuilder .
Additional query for every DocumentSnapshot within StreamBuilder
这是我的代码 . 在您的情况下,您可能希望使用新的Stateful小部件而不是ListTile,因此您可以添加FutureBuilder来调用异步函数 .
我也有这个问题,我正在尝试查询其子集合中的字段等于userid的特定文档