如何将Firestore的收集数据存储到列表中?

时间:2020-05-01 17:23:12

标签: firebase flutter dart google-cloud-firestore

我希望将来自Firestore的数据存储到一个列表中,该列表将包含其所有文档中的数据。

我将列表定义为:

List retrievedData = List();

接下来,按下按钮,我想在特定集合的所有文档中打印数据。所以,我这样做了:

RaisedButton(
        onPressed: () async {

          var collectionReferece = await Firestore.instance.collection('insults');
          collectionReferece.getDocuments().then((collectionSnapshot){
            retrievedData = collectionSnapshot.documents.toList();
          });

          print(retrievedData);
        },

我希望在控制台中看到它:

I/flutter (11351): [{index: 200, title: This is a test 1},{index: 100, title: This is a test 2}]

但是我明白了:

I/flutter (11351): [Instance of 'DocumentSnapshot', Instance of 'DocumentSnapshot']

此外,我只想将此数据存储在列表或任何其他变量中。帮帮我。谢谢。

编辑:

我尝试使用forEach,但每次按下按钮时它都会继续增加。

3 个答案:

答案 0 :(得分:2)

如果要:

  1. 从Firestore检索数据
  2. 添加到列表
  3. 创建listview.builder

然后您可以执行以下操作,首先在State类下声明以下变量:

class _MyHomePageState extends State<MyHomePage> {
  bool isFirstTime = false;
  List<DocumentSnapshot> datas = List<DocumentSnapshot>();

接下来,创建一个名为getData()的方法,该方法将在onPressed中引用:

      floatingActionButton: FloatingActionButton(
        onPressed: getData,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 

  getData() async {
    if (!isFirstTime) {
      QuerySnapshot snap =
          await Firestore.instance.collection("insults").getDocuments();
      isFirstTime = true;
      setState(() {
        datas.addAll(snap.documents);
      });
    }
  }

按一下FAB,您将在insults集合中获取数据。我们使用布尔值每次点击仅检索一次。在您要覆盖的方法dispose中:

  @override
  void dispose() {
    super.dispose();
    this.isFirstTime = false;
  }
}

您可以再次将isFirstTime分配给false。然后要显示数据,可以使用body的属性AppBar,将其分配给Center小部件,而Center小部件将包含listview

      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: ListView.builder(
          itemCount: datas.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('${datas[index]["index"]}'),
              subtitle: Text('${datas[index]["title"]}'),
            );
          },
        ),

使用listview.builder,您将在屏幕上看到一个列表,而不必使用forEach来迭代一个列表。您只需使用get运算符[]就能获取列表中的数据。

答案 1 :(得分:1)

任何需要访问Firestore数据的代码都必须位于then内部。所以:

  var collectionReferece = await Firestore.instance.collection('insults');
  collectionReferece.getDocuments().then((collectionSnapshot){
    retrievedData = collectionSnapshot.documents.toList();
    print(retrievedData);
  });

但是,您通常希望将数据加载与build()方法分开,并使用state或FutureBuilder将数据库中的数据获取到呈现的输出中。一些例子:

答案 2 :(得分:0)

我认为这是因为.toList()方法将这两个文档放在与List中“ DocumentSnapshot”相同的数据类型上。尝试打印以确保结果。

print(retrievedData[0]['title']);