0

我正在尝试从特定集合用户中检索数据,如下面的代码所示,但是当我查询此集合中的用户时,列表视图不显示。换句话说,它只显示一个 CircularProgressIndicator() 表示没有数据可以找到。在我注释掉 where 查询的那一刻,listview 完美呈现。

        backgroundColor: MyApp.backgroundColor,
        body: StreamBuilder<QuerySnapshot>(
          stream: _firestore
              .collection('users')
//            .where("chapter", isEqualTo: chapter)
              .orderBy('count', descending: true)
              .snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData)
              return Center(child: CircularProgressIndicator());
            return ListView.builder(
              itemExtent: 80.0,
              itemCount: snapshot.data.documents.length,
              itemBuilder: (context, index) =>
                  _buildListItem(context, snapshot.data.documents[index]),
            );
          },
        ),
      );

我尝试将 Nested StreamBuilders 和 FutureBuilder 与 Streambuilder 结合使用,但这些解决方案都不起作用。对于这样一个关键特性,必须有一个简单的解决方案。

请告诉我如何同时查询和使用 StreamBuilder。

4

1 回答 1

0

如下面的代码片段所示,这里的技巧是用 FutureBuilder 包装 StreamBuilder。如果您想要进行任何涉及需要时间获取的查询,您需要一个 FutureBuilder。在我的情况下,需要加载章节,以便列表视图可以查询它。列表视图未使用数据更新的原因是,当列表视图尝试呈现时,章节为空。

注意:如果您要查询提前知道的内容,则不需要 FutureBuilder。我为硬编码的章节测试了这个,它工作得很好。

return FutureBuilder(
        future: _loadChapter(),
          builder: (context, snapshot) {
            return Scaffold(
              backgroundColor: MyApp.backgroundColor,
              body: StreamBuilder<QuerySnapshot>(
                stream: _firestore
                    .collection('users')
                    .where("chapter", isEqualTo: chapter)
                    .orderBy('count', descending: true)
                    .snapshots(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData)
                    return Center(child: CircularProgressIndicator());
                  return ListView.builder(
                    itemExtent: 80.0,
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (context, index) =>
                        _buildListItem(context, snapshot.data.documents[index]),
                  );
                },
              ),
            );
          }
      );

这是 loadChapter 方法的外观,以供参考。

 Future<void> _loadChapter() async {
    return await _populateCurrentUser(loggedInUser);
  }

_populateCurrentUser(loggedInUser) 本质上是找到与当前登录用户链接的文档并填充全局变量,例如chapter

于 2020-03-02T04:08:49.433 回答