Firestore查询正在返回数据,但Futurebuilder表示该数据不能为空

时间:2020-05-10 19:36:49

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

我正在尝试从我在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);


  });
});


}

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

我的窗口小部件树中的“我的未来构建器”如下:

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空错误。

Null error on Future Builder.

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

请帮助。

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

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

1 个答案:

答案 0 :(得分:1)

使用FutureBuilder时,您需要添加退货:

           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();
  }