Flutter-网络断开时如何确定使用Firestore

时间:2019-05-10 17:57:16

标签: flutter google-cloud-firestore

我正在使用的应用程序中使用Firestore。连接到Internet后,它可以正常工作。当我没有连接到互联网时,我想知道它没有连接,或者能够控制超时。尝试在未连接互联网的情况下上传图像时,我在718秒后收到响应。 如何通过Flutter / Firestore测试互联网是否已连接以及如何防止这么长的超时时间? 请注意:该代码在线运行正常。 相关代码如下:

    _stopwatch.start();
    print("Waiting for storage ref");
    final StorageReference storageRef =
FirebaseStorage.instance.ref().child(
'$sFilename.jpg');
    print("Putting file");
    final StorageUploadTask uploadTask =
storageRef.putFile(imageFile);
    print("waiting for snapshot");
    final StorageTaskSnapshot snapshot = (await
uploadTask.onComplete);
    print("Waiting for download url");
    var vImageUrl = (await
snapshot.ref.getDownloadURL());
} catch (vError) {
      _stopwatch.stop;
      _sLastError =
      "${getDateTime()} uploadImage: Elapsed:
${_stopwatch.elapsedMilliseconds ~/ 1000} seconds,
Size = $iSize,  Error = ${vError.toString()}";
    _logError(_sLastError);
    throw (_sLastError);
 }
The response on screen is as follows:
Waiting for storage ref
I/flutter (15999): Putting file
I/flutter (15999): waiting for snapshot
I/flutter (15999): EVENT StorageTaskEventType.progress
I/flutter (15999): EVENT StorageTaskEventType.progress
I/flutter (15999): EVENT StorageTaskEventType.failure
I/flutter (15999): Waiting for download url
I/flutter (15999): Image upload failed
I/flutter (15999): FirestoreService: 163 2019-05-11
  00:28 uploadImage: Elapsed: 718 seconds, Size =
  49302,  Error = PlatformException(download_error,
 The operation retry limit has been exceeded., null)

2 个答案:

答案 0 :(得分:0)

看来Firestore目前没有解决方案。我似乎在短期内为自己解决了此问题的方法是在一次交易中尝试获取文档。如果导致错误,则表明没有互联网连接。这似乎起作用。在加载图像之前,我(在事务内)尝试加载文档(等待tx.get(docRef))。如果失败并显示错误,则表明没有互联网连接。

答案 1 :(得分:0)

以下提到的代码段可能会对您有所帮助。我正在使用此代码来检测互联网是否可用。这在连接了WiFi但无法连接互联网的情况下非常有用。

try {
      final result = await InternetAddress.lookup('google.com');
      if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
        print('connected');
      }
    } on SocketException catch (_) {
      print('not connected');
     //Here you can setState a bool like internetAvailable = false;
     //or use call this before uploading data to firestore/storage depending upon the result, you can move on further.
}