使用StreamBuilder并从Firebase Firestore数据库查询时,ListView不会更新/获取数据

时间:2020-03-02 03:14:51

标签: listview flutter google-cloud-firestore querying stream-builder

我正尝试从特定集合 users 中检索数据,如下面的代码所示,但是当我查询该集合中的用户时,列表视图不会显示。换句话说,它仅显示一个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]),
            );
          },
        ),
      );

我已经尝试将嵌套的StreamBuilder和FutureBuilder与Streambuilder结合使用,但是这些解决方案均无效。对于这种关键功能必须有一个简单的解决方案。

请为我提供有关如何同时查询和使用StreamBuilder的建议。

1 个答案:

答案 0 :(得分: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 之类的全局变量。