Flutter和Cloud Firestore在ListView.builder中的StreamProvider中获取documentId

时间:2020-04-03 09:55:08

标签: firebase flutter dart google-cloud-firestore

我正在尝试从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中轻松访问它以进行更新和删除功能。

0 个答案:

没有答案