我正尝试从特定集合 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的建议。
答案 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 之类的全局变量。