等待 Flutter Firebase 离线问题

Flutter Firebase offline issues with await

当我尝试在我的可重新排序列表视图中重新排序时,我 运行 遇到了问题。如果用户在线,等待文档引用(如代码中所示)运行s 足够快。问题是,如果用户离线,Firebase 等待功能可能需要 20 秒以上的时间。另一方面,如果我不等待这些更改,而是进行多次快速重新排序,那么当我重新上线时生成的写入结果与我在应用程序中的“订购”状态有很大不同。

我能做些什么来避免等待吗?

我想过检查在线状态并在离线时禁用此功能,或者在功能等待时禁用重新订购功能。两者似乎都是非常糟糕的解决方案。

感谢帮助,代码如下:

Future<void> reorderExercises(int oldIndex, int newIndex,
          CollectionReference<AddExercise> whereToUpdateRef) async {
    
        

List<DocumentReference<AddExercise>> referenceList = [];


    await whereToUpdateRef.orderBy(COLUMN_DAYSINDEX).get().then(
          (value) => value.docs.forEach(
            (element) {
              referenceList.add(element.reference);
            },
          ),
        );


    void _updateIndex(int _oldIndex, int _newIndex) {
      referenceList[_oldIndex].update(
        {COLUMN_DAYSINDEX: _newIndex},
      );
    }

    if (oldIndex < newIndex) {
      newIndex -= 1;
      _updateIndex(oldIndex, newIndex);
      for (int i = oldIndex + 1; i <= newIndex; i++) {
        _updateIndex(i, i - 1);
      }
    } else {
      for (int i = oldIndex - 1; i >= newIndex; i--) {
        _updateIndex(i, i + 1);
      }
      _updateIndex(oldIndex, newIndex);
    }
  }

问题:

await 当用户没有互联网时非常慢


解法:

您检查用户是否有互联网。如果不是,您将使用重试按钮推送到 noInternet() 屏幕。

您可以使用此代码检查用户是否有互联网:

var haveInternet;

  ...

    try {
            final result = await InternetAddress.lookup('google.com');
            if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
              haveInternet = true;
            }
          } on SocketException catch (_) {
            haveInternet = false;
          }

希望对您有所帮助!

问题:

await 当用户没有互联网时非常慢


解法:

您检查用户是否有互联网。如果不是,您将使用重试按钮推送到 noInternet() 屏幕。

您可以使用此代码检查用户是否有互联网:

   Source _source = Source.serverAndCache;

    try {
            final result = await InternetAddress.lookup('example.com');
            if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
                 _source = Source.serverAndCache;

            }
          } on SocketException catch (_) {
                 _source = Source.cache;

          }
    
    firebaseDocumentReference.get(GetOptions(source: _source))...

这与 Liam 的答案非常接近,但遗憾的是我无法对其进行编辑。 使用他的代码,我更改了源选项,现在离线等待的工作速度与在线一样快。还将“google.com”更改为“expample.com”,以便在中国也能使用。