获取Firestore子集合响应作为“ Future <DocumentSnapshot>”的实例

时间:2020-05-20 19:19:19

标签: flutter google-cloud-firestore

我正在一个项目中,以从firestore中获取我的子集合数据。我有一个单独的文件,可通过Stream从主集合中获取数据,现在我试图获取子集合数据,我的子集合由一个主集合和其中的许多不同文档组成,我以后需要访问。在主页上,我正在使用Streambuilder将数据获取到主页。

这是我要获取主要收集数据的文件:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:homeautomation/modelos/dadosusuario.dart';
import 'package:homeautomation/modelos/user.dart';

class DatabaseService {
//Colection reference
final String uid;
DatabaseService({this.uid});

final CollectionReference userdata = Firestore.instance.collection('dadosusuarios');

Stream<DocumentSnapshot> get userData{
return userdata.document(uid).snapshots();
}
}

这是主页:

return  StreamBuilder<DocumentSnapshot>(
        stream: DatabaseService(uid: user.uid).userData,
        builder : ((context, snapshot){
          if (!snapshot.hasData) {
           return  Loading();
          }
          int cardamount = snapshot.data['btncount'];

          //var botao  = Firestore.instance.collection('dadosusuarios').document('5j5UF0lFovW8g5QSXXymWYsz0QB2').collection('buttons').document().get();
          //print(botao);

          List<bool> cardsValue = [snapshot.data['device1'], snapshot.data['device2'], snapshot.data['device3']];

          return Scaffold(

当我在主页上使用它时

var botao  = Firestore.instance.collection('dadosusuarios').document('5j5UF0lFovW8g5QSXXymWYsz0QB2').collection('buttons').document().get();
print(botao);

打印结果为:

Instance of 'Future<DocumentSnapshot>'

我需要添加什么,以便可以访问子集合中的数据?
数据库的外观如下: Image1 子集合: Imag2

2 个答案:

答案 0 :(得分:1)

在此语句中,您没有将任何参数传递给document():

var botao = Firestore.instance
    .collection('dadosusuarios')
    .document('5j5UF0lFovW8g5QSXXymWYsz0QB2')
    .collection('buttons')
    .document()
    .get();

这实际上对访问数据没有任何意义。如果要查询子集合,则应在子集合引用上调用get():

Firestore.instance
    .collection('dadosusuarios')
    .document('5j5UF0lFovW8g5QSXXymWYsz0QB2')
    .collection('buttons')
    .get();

这将为您提供一个Future,可用于迭代所有文档。

答案 1 :(得分:1)

您将得到的结果为Future<DocumentSnapshot>,因为Firestore将花费一些时间将查询作为其async call处理。要获得结果,您必须使用await关键字或您可以使用。

正如@Doug Stevenson指出的那样,您的查询需要更新。 这是更新的代码。

var botao  = await Firestore.instance.collection('dadosusuarios').document('5j5UF0lFovW8g5QSXXymWYsz0QB2').collection('buttons').getDocuments();
print(botao);

我建议您研究Asynchronous programming