Firebase 在Flatter应用程序中使用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

我正在开发一个应用程序,它使用Firebase的Firestore将数据发送到web。该应用程序的功能之一是能够在脱机时将数据保存在设备中,并在恢复互联网连接时将数据发送到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);}
恢复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关键字的脱机数据库。