You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:25:25