写入 FireStore - 如何在失败时显示错误(如果没有网络)

问题描述 投票:0回答:2

我正在使用此函数将数据写入 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
弹出,但这不会发生

firebase flutter dart google-cloud-firestore
2个回答
7
投票

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

所以通常的事件顺序是:

  • 您拨打电话并写入
  • 写入在本地同步执行(这意味着当
    add()
    调用返回时,数据会在本地写入 - 甚至在
    Future
    完成之前)。
  • 新文档的事件在本地触发,元数据表明文档快照中有挂起的写入。
  • ...时间流逝...
  • 写入被提交给服务器,这也解决了
    Future
    并使您的
    await
    语句完成。
  • 如果需要,可以使用更新的元数据再次触发本地事件 - 或者更新实际数据,以防服务器拒绝写入。

您的

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

您有几个选择:

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

0
投票

添加您可以调整超时(定义上传停止重试并失败所需的时间)。

默认超时时间为10分钟,即会重试10分钟。一旦超时,您就会失败。

参见:

Firebase 存储在下载过程中处理网络中断

© www.soinside.com 2019 - 2024. All rights reserved.