如何从查询文档快照中获取提要项列表?

时间:2020-09-17 00:41:18

标签: firebase flutter google-cloud-firestore stream-builder

我已经尝试了以下两个代码:一个使用StreamBuilder.ListView,另一个使用StreamBuilder.ListView.builder。我没有结果。它显示

方法'data'在null上被调用。接收方:null尝试调用: data()

我无法了解QuerySnapshots的工作方式

class FeedStream extends StatelessWidget {
  FeedStream();
  Map document;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: FirebaseFirestore.instance.collection('users').snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          return ListView.builder(
            itemCount: 2,
            itemBuilder: (context, index) {
              return _buildList(context, snapshot.data.docs[index]);
            },
          );
        },
      ),
    );
  }

  Widget _buildList(BuildContext context, DocumentSnapshot document) {
    return ListTile(
      title: Text(document.data()['displayName']),
      subtitle: Text(document.data()['bio']),
    );
  }
}



class FeedStream extends StatelessWidget {
  FeedStream();
  Map document;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: FirebaseFirestore.instance.collection('users').snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          return ListView(
            children: snapshot.data.docs.map((document) {
              return Center(
                child: Container(
                  height: MediaQuery.of(context).size.height / 6,
                  child:
                      Text('Name:' + document.data()['displayName'].toString()),
                ),
              );
            }).toList(),
          );
        },
      ),
    );
  }
}

有人可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您是说有两个文档:

  return ListView.builder(
    itemCount: 2, // HERE
    itemBuilder: (context, index) {
      return _buildList(context, snapshot.data.docs[index]);
    },
  );

但这并非总是如此,当文档少于2个时,您会看到错误。

解决方案是返回与查询快照中的文档数相对应的项目数:

  return ListView.builder(
    itemCount:, snapshot.data.docs.length,
    itemBuilder: (context, index) {
      return _buildList(context, snapshot.data.docs[index]);
    },
  );

答案 1 :(得分:0)

StreamBuilder具有一个名为initialData的属性。您可以尝试给它一个空列表。

示例:

StreamBuilder<T>(
         initialData: [], 
         stream: _myStream,
         builder: _myBuilder,
);