Firebase 在Flatter应用程序中使用Firestore中的脱机持久性
我正在开发一个应用程序,它使用Firebase的Firestore将数据发送到web。该应用程序的功能之一是能够在脱机时将数据保存在设备中,并在恢复互联网连接时将数据发送到Firestore。 我激活了离线持久性,但它不起作用 调试控制台:Firebase 在Flatter应用程序中使用Firestore中的脱机持久性,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我正在开发一个应用程序,它使用Firebase的Firestore将数据发送到web。该应用程序的功能之一是能够在脱机时将数据保存在设备中,并在恢复互联网连接时将数据发送到Firestore。 我激活了离线持久性,但它不起作用 调试控制台: W/OkHttpClientTransport(28536): Failed closing connection W/OkHttpClientTransport(28536): javax.net.ssl.SSLException: Write error
W/OkHttpClientTransport(28536): Failed closing connection
W/OkHttpClientTransport(28536): javax.net.ssl.SSLException: Write error: ssl=0x7f7acfc408: I/O error during system call, Broken pipe
W/OkHttpClientTransport(28536): at com.google.android.gms.org.conscrypt.NativeCrypto.SSL_write(Native Method)
W/OkHttpClientTransport(28536): at com.google.android.gms.org.conscrypt.NativeSsl.write(:com.google.android.gms@14798020@14.7.98 (040406-222931072):4)
Future<Null> sendFirebaseData(var selectedModel) async {
Firestore.instance.enablePersistence(true);
var certID = await getIDCertificado();
var dateTime = new DateTime.now();
var nowHour = new DateFormat('kk:mm:ss').format(dateTime);
Map<String, dynamic> dataHeader = {
'ID': certID,
};
Map<String, dynamic> finalDataMap = {}..addAll(dataGeneral)
..addAll(dataInstrumento)..addAll(dataPadrao)
..addAll(dataAdicional)..addAll(dataHeader);
await Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);}
恢复internet时,如何激活脱机持久性并与Firestore同步
我的代码:
W/OkHttpClientTransport(28536): Failed closing connection
W/OkHttpClientTransport(28536): javax.net.ssl.SSLException: Write error: ssl=0x7f7acfc408: I/O error during system call, Broken pipe
W/OkHttpClientTransport(28536): at com.google.android.gms.org.conscrypt.NativeCrypto.SSL_write(Native Method)
W/OkHttpClientTransport(28536): at com.google.android.gms.org.conscrypt.NativeSsl.write(:com.google.android.gms@14798020@14.7.98 (040406-222931072):4)
Future<Null> sendFirebaseData(var selectedModel) async {
Firestore.instance.enablePersistence(true);
var certID = await getIDCertificado();
var dateTime = new DateTime.now();
var nowHour = new DateFormat('kk:mm:ss').format(dateTime);
Map<String, dynamic> dataHeader = {
'ID': certID,
};
Map<String, dynamic> finalDataMap = {}..addAll(dataGeneral)
..addAll(dataInstrumento)..addAll(dataPadrao)
..addAll(dataAdicional)..addAll(dataHeader);
await Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);}
Future sendFirebaseData(var selectedModel)异步{
Firestore.instance.enablePersistence(true);
var certID=await getIDCertificado();
var dateTime=new dateTime.now();
var nowHour=新的日期格式('kk:mm:ss')。格式(dateTime);
映射数据头={
“ID”:certID,
};
Map finalDataMap={}..addAll(dataGeneral)
..addAll(数据仪表)..addAll(数据仪表)
..addAll(dataAdicional)..addAll(dataHeader);
等待Firestore.instance.collection('certificados').document((certID.toString())
.setData(finalDataMap);}
当您在Firestore中使用离线持久性时,不要使用事务或等待响应
因此,改变这一点:
await Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);
为此:
Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);
当您恢复internet连接时,您的数据将自动同步,即使您处于后台
应用程序关闭时不工作
脱机时承诺和回调的上下文
为什么上面的代码更改为删除“wait”起作用
在服务器上成功写入文档之前,不会调用回调,也不会完成承诺。这就是为什么如果用户界面等待写操作完成后才执行某项操作,那么即使写操作实际上是在本地缓存中进行的,它也会在“脱机模式”下冻结
可以不使用async/wait
、.then()
或回调
。Firestore将始终“执行”数据更改,就像立即应用了数据更改一样,因此您无需等待处理新数据
只有当您需要确保服务器写入已发生,并且希望在得到确认之前阻止其他事情发生时,才需要使用回调和承诺。我认为当前的答案已经过时。根据,Android和iOS默认启用离线持久性。对于网络来说,情况并非如此
在Flatter中,firestore实现基于底层操作系统。因此,您在移动应用程序上是安全的,但不使用Flitter for web。它在默认情况下是启用的,但仅当您不使用Wait或transactions时,您还可以使用timeout在特定时间后停止firestore的网络连接
ref.setData(newNote.toMap()).timeout(Duration(seconds: 2),onTimeout:() {
//cancel this call here
print("do something now");
});
谢谢在Flitter web上,这个的等效版本是什么?谢谢!当我删除await关键字时,它就起作用了:)这个答案太棒了。为什么Flatter firestore文档不显式包含此信息。但是如果我需要等待以访问DocumentSnapshot的Id,我该怎么办?那么.then()回调函数仍然可以脱机使用吗?请注意“firestore.instance.enablePersistence(true);”现在不推荐使用。您应该调用“Firestore.instance.settings(persistenceEnabled:true);”而不是。否,答案将更新。我只是在没有等待关键字的情况下尝试了一下,结果成功了。它没有使用带wait关键字的脱机数据库。