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

时间:2018-11-30 00:59:49

标签: firebase flutter google-cloud-firestore

我正在开发一个使用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);}

3 个答案:

答案 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顺畅。