Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空

Posted

技术标签:

【中文标题】Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空【英文标题】:Firestore query is returning data but Futurebuilder saying it cannot be null 【发布时间】:2020-08-26 06:53:20 【问题描述】:

我正在尝试根据我在 Firestore 中的文档构建一个列表。以下是我的未来功能:

Future getBuyerList() async 

await Firestore.instance.collection('Deals').where('buyer_id',isEqualTo: uid_global).snapshots().listen((data) 
  data.documents.forEach((doc) 

    print('in function -  $doc["car"]');


    print(doc.data);


  );
);



以上在调试器中运行良好。它显示了我希望放入列表中的项目的完整列表。

我的小部件树中的我的 Future Builder 如下:

FutureBuilder(

                future: getBuyerList(),

                builder: (BuildContext context, snapshot) 


                if(snapshot.hasData)
                  if(snapshot.connectionState == ConnectionState.waiting)

                    return Center(

                      child: CircularProgressIndicator(),

                    );


                  else

                    Center(

                      child: Text('data loaded')

                    );

                  

                else if (snapshot.hasError)

                  Text('no data');

                

                ,
              ),

我还没有将快照加载到 Listview 中,因为我正在尝试让 FutureBuilder 至少成功运行。但我不断收到 FutureBuilder 空错误。

我尝试通过返回一个列表将该函数作为非 void 函数运行,但随后在编译时出现错误,提示我无法将 Map 分配给 Future>。

请帮忙。

@Peter Haddad 的回答是正确的,但我还需要通过添加 AsyncSnapshot<QuerySnapshot> 来更改构建器:

builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)

【问题讨论】:

【参考方案1】:

使用FutureBuilder时需要添加return:

           FutureBuilder(
                future: getBuyerList(),
                builder: (BuildContext context, snapshot) 
                if(snapshot.hasData)
                  if(snapshot.connectionState == ConnectionState.waiting)
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  else
                   Center(
                      child: Text('data loaded')
                    );
                  
                else if (snapshot.hasError)
                  Text('no data');
                
                  return CircularProgressIndicator();
                ,
              ),

return CircularProgressIndicator(); 因为AsyncWidgetBuilder 返回Widget。此外,如果 FutureBuilderbuild 函数中的顶部小部件,那么您需要返回它:

return FutureBuilder( /*...*/)

关于函数getBuyerList(),请执行以下操作:

  Future<QuerySnapshot> getBuyerList() async 
    return await Firestore.instance
        .collection('Deals')
        .where('buyer_id', isEqualTo: uid_global)
        .getDocuments();
  

【讨论】:

谢谢,但现在圆形进度条似乎一直在显示。问题似乎是列表数据没有被传递到 Futurebuilder,即使它在 Future 中正确检索。它显示在控制台中。 仍然停留在循环进度上。如果我尝试在未来的构建器中打印snapshot.data,我会在控制台中得到以下内容I/flutter (25272): inside future - Instance of 'QuerySnapshot' ***.com/questions/61698823/… 点此了解如何使用futurebuilder 你需要打印(snapshot.data.data["car"]); flutter 不允许我输入第二个 .data。我什至尝试过为此使用streambuilder。似乎没有任何效果

以上是关于Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空的主要内容,如果未能解决你的问题,请参考以下文章

如何正确查询firestore数据库?

Firestore 查询返回未定义快照的位置(Vue.js / Firestore / Vuefire)

Cloud Firestore:查询找不到文档但文档存在

如何在 Flutter Firestore 中查询 2 个文档并作为列表返回?

SwiftUI + Firestore - 基于从 Firestore 返回的数组的过滤器列表

Firestore返回null反应原生android