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

如何在使用QuerySnapshot查询Firestore文档时检测网络连接异常

问题原因

默认Firestore的get()方法会优先读取本地缓存数据,断网时如果本地没有对应缓存的查询结果,会直接返回空快照,不会抛出网络异常,所以你会一直得到“文档不存在”的返回值。

调整方案

我们可以指定查询强制从服务端获取数据,网络不可达时会直接抛出异常,再对网络相关异常做单独捕获抛出,供上层业务处理重试逻辑。

修改后的代码
Future<bool> checkIfDocExists({String? id}) async {
  try {
    // 配置GetOptions强制从服务端拉取,不走本地缓存
    var snapshot = await FirebaseFirestore.instance
        .collection('rentals')
        .where('DeviceID', isEqualTo: id)
        .where('Status', isEqualTo: 0)
        .get(const GetOptions(source: Source.server));
    return snapshot.docs.isNotEmpty;
  } on FirebaseException catch (e) {
    // 匹配网络相关异常,抛出自定义提示
    if (e.code == 'unavailable' || e.code == 'network-request-failed') {
      throw Exception('网络连接失败,请检查网络后重试');
    }
    // 其余异常直接抛出
    rethrow;
  }
}
上层调用示例
Future<void> checkAndJump() async {
  try {
    bool isExists = await checkIfDocExists(id: '当前设备ID');
    if (isExists) {
      // 文档存在,执行跳转逻辑
      // Navigator.push(...)
    }
  } catch (e) {
    // 捕获到异常,停留在当前页,弹出提示引导用户重试
    // 可在这里加弹窗、Toast等提示逻辑
  }
}
补充说明
  • 如果业务需要兼容离线场景,可以加降级逻辑:服务端请求失败后,再查询本地缓存,根据业务规则判断是否跳转
  • 不同平台Firebase抛出的网络异常code可能有差异,可根据实际测试结果补充判断条件

内容的提问来源于stack exchange,提问作者Thijs van de Vijver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:36:03