我正在进行Firestore查询,并基于该查询提取集合中的一些文档。这给了我一个流,并将其放入StreamBuilder中,以便它可以侦听文档中的更改。
我的代码如下:
class ConfirmedMatchesScreen extends StatelessWidget {
final currentUid;
ConfirmedMatchesScreen({@required this.currentUid});
Stream<QuerySnapshot> _getConfirmedMatches() {
return Collection<MatchRequest>(path: 'requests')
.ref
.where('status', isEqualTo: 'Confirmed')
.where('users', arrayContains: '$currentUid')
.orderBy('last_activity')
.snapshots();
}
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
initialData: null,
stream: _getConfirmedMatches(),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<MatchRequest> matchRequests = snapshot.data.documents
.map((doc) =>
Global.models[MatchRequest](doc.data) as MatchRequest)
.toList();
if (matchRequests.length > 0) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: ListView.builder(
itemCount: matchRequests.length,
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemExtent: 250,
itemBuilder: (context, index) {
if (matchRequests.length >= index) {
final request = matchRequests[index];
return MatchRequestUser(
request: request, currentUid: currentUid);
}
return null;
},
),
);
} else {
return Center(
child: Text('Aucune nouvelle demande'),
);
}
} else {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Loader(),
SizedBox(height: 10),
Text('Recherche de vos demandes en cours...'),
],
),
);
}
});
}
}
我有问题,也许2:
当通过将状态更改为其他状态来手动更新Firestore数据库时,UI上的数据不会按预期消失。这是因为我在本地运行吗?也许在构建时会起作用吗?
当查询没有任何结果时,snapshot.hasData保持为false而不是显示true,而是使用snapshot.data == null。因此,我的页面一直显示“ Loader”。但是很奇怪,当您没有任何查询结果时,snapshot.hasData始终返回false。在运行查询并提取“空”数据后,快照仍在提取数据和没有数据的快照之间有什么区别?