写入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

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

,我还希望errorSnackBar也弹出这是不会发生的

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

所以通常的事件顺序是:

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

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

你有几个选择:

  • 代替await,你可以实现一个超时机制来确定对服务器的调用是否花费的时间超过了你认为合理的时间。
  • 你可以检查用户是否有网络连接,并在这种情况下提醒他们。
  • 你可以根据SnapshotMetadata对象中的hasPendingWritesisFromCache属性来可视化每个文档的状态,而不是使用反应性的零食条。

相关内容

最新更新