从Flutter的Firestore集合中获取所有内容

时间:2017-10-06 17:52:16

标签: firebase dart flutter google-cloud-firestore

我在我的项目中设置了Firestore。我创建了名为categories的新集合。在这个集合中,我使用uniq id创建了三个文档。现在我想在我的Flutter应用程序中获取此集合,因此我创建了CollectionReference

Firestore.instance.collection('categories')

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

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

10 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:9)

如果您只想阅读一次

,这是代码
   QuerySnapshot querySnapshot = await Firestore.instance.collection("collection").getDocuments();
    var list = querySnapshot.documents;

答案 2 :(得分:8)

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

答案 3 :(得分:8)

我能够找到解决方案:

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。

答案 4 :(得分:4)

QuerySnapshot snap = await 
    Firestore.instance.collection('collection').getDocuments();

snap.documents.forEach((document) {
    print(document.documentID);
  });

答案 5 :(得分:2)

截至 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
}

答案 6 :(得分:0)

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

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

FirebaseFirestore.instance.collection("categories").get().then(
  (value) {
    value.docs.forEach(
      (element) {
        print(element.data());
      },
    );
  },
);

答案 7 :(得分:0)

更新:

  • 一次性读取所有数据:

    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.
      }
    });
    

答案 8 :(得分:0)

如果您将数据存储在文档 Id 中呢? 如果文档是空的,则不可能获得 id 文档,这是一个错误,除非您在特定文档中设置一个字段

enter image description here

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

答案 9 :(得分:0)

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