首页 > 解决方案 > 写入 FireStore - 失败时如何显示错误(如果没有网络)

问题描述

我正在使用此功能将数据写入 Firestore -效果很好

  Future<void> validateForm() async {
    try {
      await FirebaseFirestore.instance.collection('collectionPath').add({
        'full_name': 'John Doe',
        'company': 'Stokes and Sons',
        'age': '42',
      });
      ScaffoldMessenger.of(context).showSnackBar(successSnackBar);
    } catch (e) {
      print(e.toString());
      ScaffoldMessenger.of(context).showSnackBar(errorSnackBar);
    }
  }

但是当数据无法写入 FireStore 时,我正在尝试显示 SnackBar

我也想errorSnackBar弹出不会发生

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


没有到后端的网络连接不是 Firestore 客户端的错误情况。在这种情况下,他们只需在本地提交写入,触发所有必要的事件,并在连接可用时与服务器同步。

所以通常的事件顺序是:

  • 你打了一个电话,上面写着
  • 写入是在本地同步执行的(这意味着当add()调用返回时,数据会在本地写入 - 甚至在Future完成之前)。
  • 新文档在本地触发事件,元数据指示文档快照中有待处理的写入。
  • .... 时间流逝...
  • 写入被提交给服务器,这也解决了您的语句Future并使您的await语句完整。
  • 如果需要,使用更新的元数据再次触发本地事件 - 或者在服务器拒绝写入的情况下更新实际数据。

catch实际上,只有当本地写入操作失败或写入在服务器上被拒绝时(通常是因为它违反了您的安全规则),您才会被调用。在所有其他情况下,(故意)没有抛出错误。

你有几个选择:

  • await您可以实现一个超时机制来确定对服务器的调用是否花费了比您认为合理的时间更长的时间,而不是您。
  • 您可以检查用户是否有网络连接,并在这种情况下提醒他们。
  • 您可以根据其objecthasPendingWrites中的andisFromCache属性,在线可视化每个文档的状态,而不是使用响应式快餐栏。SnapshotMetadata

推荐阅读