具有Firestore加载功能的StreamBuilder与无数据

时间:2020-02-03 20:09:53

标签: firebase flutter google-cloud-firestore

这对我来说有点像个错误,但我不确定。我在通过Stream Builder运行的Flutter应用中有一个简单的Firestore查询。看起来像这样-

StreamBuilder(
  stream: Firestore.instance.collection('users').where('toNumber', isEqualTo: '123').snapshots();
  builder: (context, snapshot) {
  if (!snapshot.hasData) {
    return Center(
      child: CircularProgressIndicator(),
    );
  } else {
    if (snapshot.data.length == 0) {
      return Center(child: Text("No Data"));
    } else {
      return ListView.builder(
        itemCount: snapshot.data.length,
        itemBuilder: (context, index) =>
            _buildList(
                context, snapshot.data[index]),
      );
    }   
  }
)

问题是,如果查询没有返回结果,那么您在连续进度指示器中看到的所有内容。我以为hasData会返回true,但事实并非如此。我也尝试使用ConnectionState,但这总是返回.waiting

在这种情况下,您如何区分正在加载的查询和不返回任何结果的查询?

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

if (!snapshot.hasData) {
 if (snapshot.data.length == 0) {
      return Center(child: Text("No Data"));
    }
   else{ 
    return Center(
      child: CircularProgressIndicator(),
    );
  }
} 

答案 1 :(得分:0)

这是我的构建方法。我刚刚测试过,它正在工作。

@override
Widget build(BuildContext context) {
    return StreamBuilder(
        stream: firestore
            .collection('todos')
            .where('state', isEqualTo: false)
            .snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
          print(snapshot.connectionState);
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          return snapshot.data.documents.isNotEmpty
              ? ListView.builder(
                  itemCount: snapshot.data.documents.length,
                  itemBuilder: (_, index) {
                    return Text(snapshot.data.documents[index].data["title"]);
                  })
              : Text('No Data');
        });
}

此打印:

I/flutter ( 6216): ConnectionState.waiting
I/flutter ( 6216): ConnectionState.active