Flutter & Cloud Firestore получают идентификатор документа в StreamProvider в ListView.builder - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь получить 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(
          ...

Моя текущая проблема заключается в том, что в каждом сообщении "плитка" есть кнопка для удаления и обновления. Но чтобы выполнять эти действия, мне нужно знать, какой документ обновлять или удалять, основываясь на documentId. Эти функции также помещены в файл database.dart.

Я пытался вызвать

userPosts[0].documentId

, но из этого получаю только 'null'.

Я строю эта структура / логика c неверна с самого начала, которая вызывает эту проблему, когда я заблокировал себе доступ к documentId или есть пропущенный шаг?

Редактировать

Это был я не такой умный и не думал здраво. В своем классе Post () я добавил еще одно поле String, например: final String documentId; затем в возвращаемом снимке я просто добавил еще одну строку, подобную этой: documentId: do c .documentId; и тогда я мог легко получить к нему доступ в ListView.builder для обновления и удаления функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...