【问题标题】:Firestore query is returning data but Futurebuilder saying it cannot be nullFirestore 查询正在返回数据,但 Futurebuilder 说它不能为空
【发布时间】: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)

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore future


    【解决方案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'
    • stackoverflow.com/questions/61698823/… 点此了解如何使用futurebuilder
    • 你需要打印(snapshot.data.data["car"]);
    • flutter 不允许我输入第二个 .data。我什至尝试过为此使用streambuilder。似乎没有任何效果
    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 2020-03-08
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多