在Flutter应用中在Firestore中使用离线持久性

Bre*_*des 4 firebase flutter google-cloud-firestore

我正在开发一个使用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)
Run Code Online (Sandbox Code Playgroud)

恢复互联网后,如何激活离线持久性并与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);}
Run Code Online (Sandbox Code Playgroud)

die*_*per 11

当您在Firestore中使用离线持久性时,请勿使用“交易”或await进行响应。

因此,更改此:

  await Firestore.instance.collection('certificados').document((certID.toString()))
      .setData(finalDataMap);
Run Code Online (Sandbox Code Playgroud)

对此:

 Firestore.instance.collection('certificados').document((certID.toString()))
      .setData(finalDataMap);
Run Code Online (Sandbox Code Playgroud)

恢复互联网连接后,即使您处于后台,数据也将自动同步。

当您的应用关闭时不起作用。

  • 这个答案太棒了为什么 Flutter firestore 文档不明确包含此信息。 (2认同)

yva*_*den 5

我认为当前的答案已经过时了。根据firebase文档,Android和iOS默认启用离线持久性。对于网络来说,情况并非如此。

在flutter中,firestore的实现是基于底层操作系统的。因此,您在移动应用程序上是安全的,但在网络上使用 flutter 就不安全了。

  • 不,答案已更新。我只是尝试不使用await关键字并且它有效。它没有使用带有await关键字的离线数据库。 (4认同)