#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();
})