Flutter中StreamBuilder判断Firebase空集合数据异常的解决求助
问题原因
Firebase 的 QuerySnapshot 即使目标集合不存在或没有匹配的文档,也会返回一个非空对象,所以原判断条件 snapshot.hasData && snapshot.data != null 会始终为 true。真正需要检查的是快照中的 docs 列表是否为空,以此判断是否有实际事件数据。
解决方案
修改判断逻辑,增加对 docs 列表是否为空的检查,同时在无数据时直接传入空列表渲染日历组件:
StreamBuilder<QuerySnapshot>( stream: _db .collection('users') .doc(ref.read(globalsNotifierProvider).currentUserId) .collection('events') .where('eventDate', isGreaterThanOrEqualTo: kFirstDay) .where('eventDate', isLessThanOrEqualTo: kLastDay) .snapshots(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return Center( child: Text('Error fetching data: ${snapshot.error}'), ); } debugPrint('Data: ${snapshot.data}'); if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } else { // 新增docs非空判断 if (snapshot.hasData && snapshot.data.docs.isNotEmpty) { List<Events> eventsList = snapshot.data.docs .map((e) => Events.fromJson(e)) .toList(); return _buildTableCalendar(eventsList); } else { // 无事件数据时直接传入空列表渲染日历 return _buildTableCalendar([]); } } }, ),
说明
- 当集合不存在或无匹配文档时,
snapshot.data.docs会是空列表,此时传入空列表给_buildTableCalendar即可让日历正常展示。 - 无需继续返回加载指示器,因为此时数据请求已完成,只是没有事件数据。
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

