28

我在我的项目中设置了 Firestore。我创建了名为categories. 在这个集合中,我创建了三个具有唯一 ID 的文档。现在我想在我的 Flutter 应用程序中获取这个集合,所以我创建了CollectionReference

Firestore.instance.collection('categories')

但我不知道接下来会发生什么。

我正在使用这个插件firebase_firestore: 0.0.1+1

4

11 回答 11

43

这是从我发现有效的集合中获取所有数据的最简单方法,而无需使用已弃用的方法。

CollectionReference _collectionRef =
    FirebaseFirestore.instance.collection('collection');

Future<void> getData() async {
    // Get docs from collection reference
    QuerySnapshot querySnapshot = await _collectionRef.get();

    // Get data from docs and convert map to List
    final allData = querySnapshot.docs.map((doc) => doc.data()).toList();

    print(allData);
}
于 2021-01-06T03:06:24.597 回答
37

如果您只想阅读一次,这是代码

   QuerySnapshot querySnapshot = await Firestore.instance.collection("collection").getDocuments();
    var list = querySnapshot.documents;
于 2018-05-27T05:08:49.310 回答
30

使用StreamBuilder

import 'package:flutter/material.dart';
import 'package:firebase_firestore/firebase_firestore.dart';

class ExpenseList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance.collection("expenses").snapshots,
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (!snapshot.hasData) return new Text("There is no expense");
          return new ListView(children: getExpenseItems(snapshot));
        });
  }

  getExpenseItems(AsyncSnapshot<QuerySnapshot> snapshot) {
    return snapshot.data.documents
        .map((doc) => new ListTile(title: new Text(doc["name"]), subtitle: new Text(doc["amount"].toString())))
        .toList();
  }
}
于 2017-10-06T20:42:30.697 回答
10

我能够想出一个解决方案:

Future getDocs() async {
  QuerySnapshot querySnapshot = await Firestore.instance.collection("collection").getDocuments();
  for (int i = 0; i < querySnapshot.documents.length; i++) {
    var a = querySnapshot.documents[i];
    print(a.documentID);
  }
}

调用该getDocs()函数,我使用了 build 函数,它在控制台中打印了所有文档 ID。

于 2020-04-30T20:25:54.297 回答
6

截至 2021 年,cloud_firestore包发生了一些重大变化。我在一个项目上使用 firestore,发现由于 API 更改,所有旧教程都不起作用。

在查看 Stack 上的文档和其他一些答案之后,这里是相同的解决方案。

您需要做的第一件事是为您的收藏创建参考。

CollectionReference _cat = FirebaseFirestore.instance.collection("categories");

下一步是查询集合。为此,我们将get在集合引用对象上使用该方法。

QuerySnapshot querySnapshot = await _cat.get()

最后,我们需要解析查询快照以从集合中的每个文档中读取数据。在这里,我们将每个文档解析为地图(字典)并将它们推送到列表中。

final _docData = querySnapshot.docs.map((doc) => doc.data()).toList();

整个函数看起来像这样:

getDocumentData () async {
    CollectionReference _cat = FirebaseFirestore.instance.collection("categories");
    final _docData = querySnapshot.docs.map((doc) => doc.data()).toList();
    // do any further processing as you want
}

于 2021-07-16T20:19:18.733 回答
5
QuerySnapshot snap = await 
    Firestore.instance.collection('collection').getDocuments();

snap.documents.forEach((document) {
    print(document.documentID);
  });
于 2020-08-19T07:23:07.120 回答
3
final _fireStore = FirebaseFirestore.instance;
Future<void> getData() async {
    // Get docs from collection reference
    QuerySnapshot querySnapshot = await _fireStore.collection('collectionName').get();

    // Get data from docs and convert map to List
    final allData = querySnapshot.docs.map((doc) => doc.data()).toList();
  //for a specific field
  final allData =
          querySnapshot.docs.map((doc) => doc.get('fieldName')).toList();

    print(allData);
}
于 2021-08-09T10:56:02.950 回答
2

对我来说,它适用于 cloud_firestore 版本 ^2.1.0

这是以 JSON 形式显示每个集合的简单代码。我希望这会对某人有所帮助

FirebaseFirestore.instance.collection("categories").get().then(
  (value) {
    value.docs.forEach(
      (element) {
        print(element.data());
      },
    );
  },
);
于 2021-05-17T02:32:23.167 回答
2

更新:

  • 一次性读取所有数据:

    var collection = FirebaseFirestore.instance.collection('users');
    var querySnapshot = await collection.get();
    for (var doc in querySnapshot.docs) {
      Map<String, dynamic> data = doc.data();
      var fooValue = data['foo']; // <-- Retrieving the value.
    }
    
  • 监听所有数据:

    var collection = FirebaseFirestore.instance.collection('users');
    collection.snapshots().listen((querySnapshot) {
      for (var doc in querySnapshot.docs) {
        Map<String, dynamic> data = doc.data();
        var fooValue = data['foo']; // <-- Retrieving the value.
      }
    });
    
于 2021-06-06T15:17:47.740 回答
1

从 Firestore 中检索数据的最简单方法是:

    void getData() async {
        await for (var messages in _firestore.collection('collection').snapshots()) 
        { 
            for (var message in messages.docs.toList()) {
                print(message.data()); 
            }
        }
    }
于 2021-12-04T00:16:52.677 回答
0

如果您将数据存储在文档 ID 中会怎样?如果文档为空,则无法获取 id 文档,这是一个错误,除非您在特定文档中设置字段

在此处输入图像描述

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

final database1 = FirebaseFirestore.instance;
Future<QuerySnapshot> years = database1
  .collection('years')
  .get();

class ReadDataFromFirestore extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    return FutureBuilder<QuerySnapshot>(
        future: years,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            final List<DocumentSnapshot> documents = snapshot.data.docs;
            return ListView(
                children: documents
                    .map((doc) => Card(
                          child: ListTile(
                        title: Text('doc.id: ${doc.id}'),
                            //subtitle: Text('category:     ${doc['category']}'),
                      ),
                    ))
                .toList());
      } else if (snapshot.hasError) {
        return Text(snapshot.error);
      }
      return CircularProgressIndicator();
    }
    );
  }
}
于 2021-08-05T15:46:06.953 回答