【问题标题】:the method "get" isn't defined for class query没有为类查询定义方法“get”
【发布时间】:2020-04-20 11:14:30
【问题描述】:

错误:没有为类查询定义方法“get”

我不太了解如何使用查询从 Firestore 获取数据以及如何在文本中显示它,请指教

getData(String docId)async{
  final  QuerySnapshot snapshot = await Firestore.instance.collection('listofprods').where('id', isEqualTo: docId).get(); // error in the get
  return snapshot;
  }
}

futurebuilder 中也出现错误,当我使用 getdocument() 而不是 get() 时,方法 [] 被调用为 null

FutureBuilder(
                future: fd.getData('ac1'),
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  return Container(
                    decoration:
                        BoxDecoration(border: Border.all(color: Colors.black)),
                    child: ListTile(
                      title: Text(snapshot.data['name'].toString()),
                      trailing: Text(snapshot.data['icon'].toString()),
                      onTap: (){
                        Navigator.push(context, MaterialPageRoute(builder: (context) => Ac()));
                      },
                    ),
                  );
                },
         ),

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    要获取单个文档,您不应该查询数据库,而应该获取它;)

    await Firestore.instance.collection('listofprods').doc(docId).get();
    

    futureBuilder 应该是这样的:

    FutureBuilder(
                    future: Firestore.instance.collection('listofprods').doc(docId).get(),
                    builder: (BuildContext context, DocumentSnapshot snapshot) {
                      return Container(
                        decoration:
                            BoxDecoration(border: Border.all(color: Colors.black)),
                        child: ListTile(
                          title: Text(snapshot.data['name'].toString()),
                          trailing: Text(snapshot.data['icon'].toString()),
                          onTap: (){
                            Navigator.push(context, MaterialPageRoute(builder: (context) => Ac()));
                          },
                        ),
                      );
                    },
             ),
    

    顺便说一句,您可以将Firestore.instance.collection('listofprods').doc(docId).get() 提取到另一个函数, 但无需使其异步,而是返回 Future 本身(不要添加等待)。

    【讨论】:

    • 等一下,.where('id', isEqualTo: docId) 是什么意思?
    • 您是否要获取文档“listofprods/docId”?
    • id是文件名是的
    • 哦!你根本不应该那样做......我会更新我的答案
    • 好吧,兄弟,但我想使用 .where 查询,你能告诉我,因为我已经这样做了,如何在其中使用 .where 查询?
    【解决方案2】:

    在 FutureBuilder 中,您必须检查数据是否来自数据库。您可以使用snapshot.hasData

    FutureBuilder(
                    future: Firestore.instance.collection('listofprods').doc(docId).get(),
                    builder: (BuildContext context, DocumentSnapshot snapshot) {
                      if(snapshot.hasData)
                       return Container(
                         decoration:
                            BoxDecoration(border: Border.all(color: Colors.black)),
                         child: ListTile(
                          title: Text(snapshot.data['name'].toString()),
                          trailing: Text(snapshot.data['icon'].toString()),
                          onTap: (){
                            Navigator.push(context, MaterialPageRoute(builder: (context) => Ac()));
                          },
                        ),
                      );
                      else
                         return CircularProgressIndicator();
                    },
             ),
    

    但是这个过程是错误的,因为如果我们想要获取一个特定的文档,我们应该使用DocumentSnapshot而不是QuerySnapshot。我们应该使用StreamBuilder而不是FutureBuilder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-23
      • 2021-09-02
      • 2019-06-24
      • 2021-01-30
      • 2020-09-10
      • 2019-05-23
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多