如何在使用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
相关产品推荐
相关产品推荐

