我正在尝试从documentId
中的文档中获取ListView.builder
。
这就是我得到的:
我有一个database.dart
,我在其中建立这样的文档:
// get user posts doc stream
Stream<List<Post>> get userPosts {
final CollectionReference userPostsCollectionPosts = Firestore.instance.collection('user_posts').document('XdJXkE9ijma7ep1KLXHFLlbXsf43').collection('posts');
return userPostsCollectionPosts.snapshots()
.map(_userPostsFromSnapshot);
}
List<Post> _userPostsFromSnapshot(QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return Post(
postCreator: doc.data['postCreator'] ?? '',
postDateCreated: doc.data['postDateCreated'].toDate() ?? DateTime.now(),
postTitle: doc.data['postTitle'] ?? '',
postText: doc.data['postText'] ?? '',
postCategories: doc.data['postCategories'] ?? '',
postPublic: doc.data['postPublic'] ?? false,
postViews: doc.data['postViews'] ?? 0,
postLikes: doc.data['postLikes'] ?? 0,
);
}).toList();
}
然后我有一个个人资料页面,在这里我将使用StreamProvider列出每个帖子:
return StreamProvider<List<Post>>.value(
value: DatabaseService().userPosts,
child: Scaffold(
...
在此小部件内,我有一个名为ProfileUserPosts()的小部件,在该小部件中,我具有这样的ListView.builder:
//First, I get the userPosts like this
final userPosts = Provider.of<List<Post>>(context) ?? [];
//Then, I use a ListView.builder to list the userPosts like this:
child: ListView.builder(
itemCount: userPosts.length,
itemBuilder: (context, index) {
return Container(
...
我当前的问题是每个帖子“ tile”都有一个用于删除和更新的按钮。但是为了能够执行这些操作,我需要基于documentId
了解要更新或删除的文档。这些功能也放置在database.dart
文件中。
我尝试致电
userPosts[0].documentId
但只能从中获取“ null”。
我是从一开始就错误地构建了此结构/逻辑,从而导致了此问题,我阻止了自己访问documentId
,还是缺少我的步骤?
修改
我不是那么聪明,没有思考。在我的Post()类中,我添加了另一个字段String,如下所示:final String documentId;然后在快照返回中,我仅添加了另一行,如下所示: documentId:doc.documentId;然后我可以在ListView.builder中轻松访问它以进行更新和删除功能。