我正在使用此函数将数据写入 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
,您可以实现超时机制来确定对服务器的调用是否花费的时间比您认为合理的时间长。hasPendingWrites
对象中的
isFromCache
和
SnapshotMetadata
属性可视化每个文档的在线状态,而不是使用反应式小吃栏。