【问题标题】:Firestore access broken after an offline attempt离线尝试后 Firestore 访问中断
【发布时间】:2018-12-06 04:40:14
【问题描述】:

我正在尝试使用这段代码访问 Cloud Firestore:

void _submit(BuildContext context) async {
    final DocumentReference postRef = Firestore.instance.document(dbPath);
    Firestore.instance.runTransaction((transaction) async {
        DocumentSnapshot freshSnap = await transaction.get(postRef);
        await transaction.update(freshSnap.reference, {
            'value': freshSnap['value'] + 1
        });
   });
}

如果打开 wifi 或移动数据,一切正常。 (符合预期

如果 wifi 和移动数据关闭,则无法使用。 (如预期的那样)。但是当我等到超时(在调用方法之后)然后才打开移动数据和wifi,它不再工作,我收到以下错误:

E/flutter ( 7041): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7041): PlatformException(Error performing transaction, Timed out waiting for Task, null)
E/flutter ( 7041): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:547:7)
E/flutter ( 7041): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:279:18)
E/flutter ( 7041): <asynchronous suspension>
E/flutter ( 7041): #2      Firestore.runTransaction (file:///C:/{myPath}/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.7.3/lib/src/firestore.dart:115:10)
E/flutter ( 7041): <asynchronous suspension>
E/flutter ( 7041): #3      _FeedbackPageState._submitFeedback (package:appli_salon_data/view/program/FeedbackPage.dart:74:26)
E/flutter ( 7041): <asynchronous suspension>
E/flutter ( 7041): #4      _FeedbackPageState.build.<anonymous closure> (package:appli_salon_data/view/program/FeedbackPage.dart:60:26)
E/flutter ( 7041): #5      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:494:14)
E/flutter ( 7041): #6      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:549:30)
E/flutter ( 7041): #7      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter ( 7041): #8      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
E/flutter ( 7041): #9      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:123:7)
E/flutter ( 7041): #10     GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
E/flutter ( 7041): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
E/flutter ( 7041): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
E/flutter ( 7041): #13     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
E/flutter ( 7041): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
E/flutter ( 7041): #15     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
E/flutter ( 7041): #16     _invoke1 (dart:ui/hooks.dart:134:13)
E/flutter ( 7041): #17     _dispatchPointerDataPacket (dart:ui/hooks.dart:91:5)

不是预期的

在我重新启动应用程序之前,该方法将不再有效。

如果有人对此行为有一些解释,请随时回答:)

更新:我试过了:

  1. 关闭无线网络
  2. 尝试运行事务 - 导致预期失败
  3. 开启无线网络
  4. 尝试运行事务

这是有趣的部分:在第 4 步,事务“立即”运行两次,两次都收到错误:

PlatformException(Error performing Transaction#get, UNAVAILABLE: Unable to resolve host firestore.googleapis.com, null)

调用transaction.get(postRef)时。

这是否意味着 Firestore 在短暂失去 Internet 连接后会以某种方式失去对主机的所有访问权限?我该如何解决?

【问题讨论】:

  • 您找到解决方案了吗?我也有这个问题。如果事务超时,我会发现错误。然后我重新启用wifi,除非我强制退出应用程序,否则firestore将不再工作。

标签: firebase dart google-cloud-firestore flutter


【解决方案1】:

您是否尝试过启用本地持久性?不确定这是否会解决问题,但可能值得一试。我相信这是使用settings 方法中的persistenceEnabled 参数完成的:

Firestore.instance.settings(persistenceEnabled: true)

请记住,这应该只执行一次,因此它应该位于代码中不会在您每次访问任何 Firestore 数据时都被调用的某个位置。

【讨论】:

猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多