带Firestore集合查询的StreamBuilder

时间:2019-12-18 17:45:51

标签: firebase flutter google-cloud-firestore

我正在进行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:

  1. 当通过将状态更改为其他状态来手动更新Firestore数据库时,UI上的数据不会按预期消失。这是因为我在本地运行吗?也许在构建时会起作用吗?

  2. 当查询没有任何结果时,snapshot.hasData保持为false而不是显示true,而是使用snapshot.data == null。因此,我的页面一直显示“ Loader”。但是很奇怪,当您没有任何查询结果时,snapshot.hasData始终返回false。在运行查询并提取“空”数据后,快照仍在提取数据和没有数据的快照之间有什么区别?

0 个答案:

没有答案