【问题标题】:Writing to FireStore - how to show error when fails (if no network)写入 FireStore - 失败时如何显示错误(如果没有网络)
【发布时间】:2021-08-06 15:06:15
【问题描述】:

我正在使用此功能将数据写入 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

  • 目前,如果我将模拟器切换到 飞行模式successSnackBar 不会显示 - 这正是我想要的

但是我也希望 errorSnackBar 弹出 too 这不会发生

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

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

    所以通常的事件顺序是:

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

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

    你有几个选择:

    • 您可以实施超时机制来代替await,以确定对服务器的调用所花费的时间是否比您认为合理的时间长。
    • 您可以检查用户是否有网络连接,并在这种情况下提醒他们。
    • 您可以根据SnapshotMetadata object 中的hasPendingWritesisFromCache 属性,直观地显示每个文档的状态,而不是使用反应式快餐栏。

    【讨论】:

    • 我明白了!非常感谢这个详细的解释 - 现在很清楚?⚡️?
    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2011-12-25
    • 2018-03-08
    • 1970-01-01
    • 2018-08-18
    • 2019-07-06
    • 2017-02-02
    相关资源
    最近更新 更多