无法显示流中的数据

时间:2019-11-21 23:05:19

标签: flutter dart google-cloud-firestore stream

我的问题是,当加载主页时,我想返回一个函数作为支架的主体,以检查流(组,其状态由super.initState设置的查询快照)是否不存在。等于null,如果组不等于null,我想显示包含组名和所有者的卡列表。如果组等于null我想显示一张被点击的卡,将使用户能够创建一个组,因此该页面在应用启动时加载,并在该页面显示后不久显示一张卡用于组创建(调试时)。重新渲染,并且当出于某种原因将组流对象传递给条件对象时,它不等于null,但无论如何,通过条件传递条件后,据我所知查询快照中没有任何内容。被调用,并向我显示“ getter'documents'在null上被调用。 接收者:null 尝试调用:“文档”。 这是我的代码,很抱歉,如果我通知您我不熟悉堆栈发布。

  getUsersGroups() async{
var usr = await _firebaseAuth.currentUser();
return _firestore.collection('groups').where('members',arrayContains: usr.email).snapshots();}

@override
void initState() {
_dataService.getUsersGroups().then((results) {
  setState(() {
    groups = results; 
  });
});
super.initState();
}

groupCardList() {
if (groups != null){
  return StreamBuilder(
    stream: groups,
    builder: (context, snapshot) {
     return ListView.builder(
        itemCount: snapshot.data.documents.length,
        padding: EdgeInsets.all(16.0),
        itemBuilder: (context, i){
          return new InkWell(
          child: Card(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(top:8.0, bottom: 4.0),
                    child: Column(
                      children: <Widget>[
                        Text(snapshot.data.documents[i].data['name'],style: TextStyle(fontSize: 25.0),),
                        Spacer(),
                        Text(snapshot.data.documents[i].data['owner'],style: TextStyle(fontSize: 10.0),),

getUsersGroups()位于data_services.dart文件中。

1 个答案:

答案 0 :(得分:0)

首先,您不需要在initState()中设置setState():

您的getUserGroups应该类似于:

Stream<QuerySnapshot> getUserGroups() {
    return _firestore.collection('groups').where('members',arrayContains: usr.email).snapshots();
}

// in your StatefulWidget:
Stream<QuerySnapshot> groups;

@override
void initState() {
     groups = _dataService.getUserGroups();
}

现在您的问题。我相信该组!= null是因为创建了对象QuerySnapshot。您可以在StreamBuilder中检查组是否有数据:

return StreamBuilder(
    stream: groups,
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
            return CircularProgressIndicator();
        }
        if (snapshot.hasData) {
          return ListView.builder { ... }
        }
        return (whatever you want to return when groups == null)
);

我希望它会有所帮助:)