Flutter: как я могу получить название всех документов коллекции в Firestore

#flutter #google-cloud-firestore

#flutter #google-cloud-firestore

Вопрос:

Я создаю приложение в Flutter с Firestore, теперь я хотел бы просмотреть все документы в коллекции, и я хочу получить имя документа (id) и поле документов и что-то с этим сделать. Я уже создал listview, в котором отображаются данные, но я не могу что-то с этим сделать, например, добавить их в список или что-то в этом роде. Спасибо

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

1. Ваш вопрос несколько расплывчатый. На чем именно вы застряли? Вы читали документацию и видели пример кода?

Ответ №1:

Вы можете сделать это, получив список документов, таких как:

 final QuerySnapshot result =
          await Firestore.instance.collection('myCollection').getDocuments();
final List<DocumentSnapshot> documents = result.documents;
  

И после этого вы можете повторить этот список и получить данные:

 documents.forEach((data) => print(data));
  

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

1. Я не могу использовать getDocuments() . Это выдает ошибку The method 'getDocuments' isn't defined for the type 'CollectionReference

2. что касается 2021 года, методы getDocument уже изменены на get ()

Ответ №2:

Сначала создайте ссылку на Firestore

 final userRef = Firestore.instance.collection('users');
  

Во-вторых, создайте итератор для получения всего документа из fireStore

  userRef.getDocuments().then((snapshot) {
      snapshot.documents.forEach((doc) {
        print(doc.data);
      });
    });
  
  • в качестве примера вы можете получить конкретные данные, такие как электронная почта :
 print(doc.data['email'];
  
  • вы можете получить идентификатор документа с помощью
 print(doc.documentID);
  
  • можно проверить, существует документ или нет, с помощью
 print(doc.exists);
  

Ответ №3:

Вот обновленный ответ. В последнее время getDocuments firebase во flutter не рекомендуется.

Вместо этого мы можем использовать get для запроса всех документов внутри коллекции.

вот так

 final QuerySnapshot result =
      await Firestore.instance.collection('myCollection').get();
final List<DocumentSnapshot> documents = result.docs;
  

и чтобы перечислить весь документ, вам просто нужно зациклить список документов следующим образом

 documents.forEach((DOC) => print(DOC.data()));
  

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

1. это должно быть помечено как ответ, поскольку оно обновлено

2. как получить идентификаторы этих документов?

3. Будет ли с нас взиматься плата за все документы или это будет засчитано как 1 прочитанное?

4. Последняя строка должна быть documents.forEach((data) => print(data.data()));

Ответ №4:

как сказал Шубхам, getDocuments теперь оно устарело, поэтому, если вы просто хотите вернуть названия документов, вам следует сделать это :

 final db = FirebaseFirestore.instance;
var result=await db.collection('Pets').get();
result.docs.forEach((res) {print(res.id); });
  

Также вы можете распечатать определенные документы, используя where вот так:

 var result=await db.collection('Pets').where("sex",whereIn:["Male"] ).get();
result.docs.forEach((res) {print(res.id); });
  

Эта работа для меня, удачи.

Ответ №5:

Вы можете эффективно извлекать данные, прослушивая их с помощью потоков.

Начните с получения ссылки на Firestore:

 final userRef = Firestore.instance.collection('users');
  

С помощью следующей функции вы будете подписываться на данные, поступающие из Firestore. Это означает, что каждый раз, когда в вашей коллекции происходят изменения, Firestore автоматически уведомляет ваше приложение (код, в котором вы прослушиваете изменения, будет перезапускаться каждый раз, когда ваше приложение получает уведомление).

В первом цикле for вы отслеживаете изменения в своей коллекции, просматривая снимки. Второй цикл for будет проходить через List<QueryDocumentSnapshot> , чтобы вы могли получить доступ к документам для каждого снимка.

 void getData() async {
 await for (var snapshot in userRef.snapshots()) {
  for(var document in snapshot.docs()) {
    print(document.data()); //You'll get printed the whole data
    print(document['email']); //You'll get printed the email field.
    print(document.id); //You'll get printed the document ID
  }
 }
  

Подсказка: Вы можете протестировать потоковую передачу, изменив что-либо в своей коллекции, непосредственно на веб-сайте Firebase.

Ответ №6:

вы можете использовать

     firestore.instance.collection('myCollection').getDocuments();
  

до 2021 года, но теперь вы должны указать, как показано ниже :

      final querySnap = await firestore.instance.collection('myCollection').get();


    for (var i = 0; i < querySnap.docs.length; i  ) {
        final data = querySnap.docs[i].id;
        log(data.toString());
    }
  

Ответ №7:

Вы также можете получить название документов, обернув виджет с помощью FutureBuilder следующим образом:

 FutureBuilder(
              future: FirebaseFirestore.instance
                  .collection("collection_name")
                  .get(),
              builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                if (snapshot.hasData) {
                  QuerySnapshot documents = snapshot.data;
                  List<DocumentSnapshot> docs = documents.docs;
                  docs.forEach((data) {
                    print(data.id);
                  });
                } else {
                  print("nodata");
                }
                return Container();
              })