等待 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”,以便在中国也能使用。
当我尝试在我的可重新排序列表视图中重新排序时,我 运行 遇到了问题。如果用户在线,等待文档引用(如代码中所示)运行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”,以便在中国也能使用。