我正在开发一个使用Firebase的Firestore将数据发送到网络的应用程序。该应用程序的功能之一是能够在脱机时将数据保存在设备中,并在恢复互联网连接后将其发送到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)
恢复互联网后,如何激活离线持久性并与Firestore同步?
我的代码:
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);}
答案 0 :(得分:5)
在Firestore中使用离线持久性时,请勿使用“交易”或await
进行响应。
所以,改变这个:
await Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);
对此:
Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);
恢复互联网连接后,即使您处于后台状态,数据也会自动同步。
关闭应用程序后不起作用。
答案 1 :(得分:2)
默认情况下启用此功能,但仅在不使用等待或事务时才启用,进一步,您可以使用超时在特定时间后停止通过Firestore监听网络连接。
ref.setData(newNote.toMap()).timeout(Duration(seconds: 2),onTimeout:() {
//cancel this call here
print("do something now");
});
答案 2 :(得分:0)
我认为当前答案已过时。根据{{3}},默认情况下,Android和iOS已启用离线持久性。对于网络而言,事实并非如此。
在扑朔迷离中,firestore实现基于底层操作系统。因此,您可以安全地使用移动应用程序,但不能确保Web顺畅。