Как преобразовать экземпляр QueryDocumentsnapshots в список — Flutter, Firestore

#flutter #google-cloud-firestore

#flutter #google-облако-firestore

Вопрос:

Я немного застрял в своем проекте, чтобы узнать больше о flutter, и надеюсь, что вы сможете мне помочь или дать мне несколько советов для какой-нибудь лекции 🙂

В моей базе данных firestore есть две коллекции — одна коллекция пользователей и одна коллекция групп.

Внутри моих пользовательских документов у меня есть массив с некоторыми идентификаторами групп. Коллекция Groups также очень проста — только некоторые коллекции с уникальными идентификаторами, а в качестве полей только имя и описание.

Теперь мне нужен список со всеми моими группами, членом которых является пользователь, поэтому мне нужно получить список с идентификаторами групп, а затем запросить базу данных, чтобы вернуть все данные группы для этих идентификаторов

К настоящему времени я возвращаю идентификаторы групп и правильные данные для групп. Но как я могу отобразить эти данные в список для Listview?

Мой код — _buildBody вызывается внутри каркаса для тела.

 Widget _buildBody() {

User _currentUser = FirebaseAuth.instance.currentUser;
DocumentReference docRef = FirebaseFirestore.instance.collection('user').doc(_currentUser.uid);

return StreamBuilder(
    stream: docRef.snapshots(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
      if(snapshot.hasError){
        return Error();
      }
      if(snapshot.connectionState == ConnectionState.waiting){
        return Loading();
      }
      
      //Get all my Group Ids
      final List<dynamic> documents = snapshot.data.get('groups');
      

      Future<List<Map>> _groups = getGroups(documents);
      
      //return ListView with Data
      return ListView(...);

    }

);



Future <List<Map<dynamic, dynamic>>> getGroups(List<dynamic> documents) async{

       List<QueryDocumentSnapshot> group_docs;
       List<Map<dynamic, dynamic>> list = new List();
      
 QuerySnapshot collectionSnapshot = await FirebaseFirestore.instance.
                                    collection('groups').where('id', whereIn: documents).get();

 //Now I have all QueryDocumentSnapshots as a instance inside the list
group_docs = collectionSnapshot.docs;


 //What now?! :D




return list;
 

}

Большое спасибо.

Ответ №1:

Это может быть следующим:

 List<Map<dynamic, dynamic>> list = [];

list = snapshot.docs.map((doc) => doc.data() ).toList();
 

Совет: как вы также можете видеть, я изменил ваш экземпляр класса List . Конечно, это не влияет на ответ, но я рекомендую вам привыкнуть к созданию экземпляров списков таким образом.

Комментарии:

1. Большое спасибо — теперь это работает. Может быть, глупый вопрос, но потому что я все еще учусь — зачем вам создавать такие экземпляры?

2. @learn2Dev Это не глупый вопрос. Это часть этого! Это рекомендация документации. Даже если вы посмотрите на Android Studio, вы увидите, что способ, которым вы это сделали, устарел. То же самое касается map {} . Не забудьте отметить как ответ на проблему. =)

3. Спасибо, чувак. Так что, возможно, было бы неплохо запретить поиск только фрагментов кода после 2020 года 🙂