问题是当我使用 Future.delayed 10 秒然后返回 future.value 时,刷新指示器行为正确,旋转 10 秒然后将其删除,但是当我将其更改为使用我的方法时,它会失败,而是旋转1秒不等我的未来回来
小部件片段外壳刷新指示器
RefreshIndicator(
key: refreshIndicatorKey,
onRefresh: () {
if (isLoading == false) {
final completer = Completer<void>();
retryFunction().then((_) {
completer.complete();
});
//This works as expected
// Future.delayed(Duration(seconds: 10), () {
// completer.complete();
// });
return completer.future;
} else {
return Future.value();
}
},
child: child);
回调(retry函数)
Future<void> initializations({bool refetchPosts = false}) async {
//When i change it to this it also works correctly.
//await Future.delayed(seconds: 10);
await ref
.read(singlePostProvider.notifier)
.fetchSinglePostInfo(widget.safePostModel.id!);
}
我在completer.complete()处设置了一个断点,是的,大约4秒后没有达到断点,但刷新指示器仍然停止显示,即使未来尚未完成。
这是提供者功能
Future<void> fetchSinglePostInfo(String id) async {
try {
state = BaseState.loading(data: state.data);
return await safeRepo.fetchPostDetails(id).then((value) {
state = BaseState.success(
SafePostModel.fromJson(value["data"]["formattedPost"]));
});
} catch (e) {
state = BaseState.error(e.toString(), data: state.data);
}
}
听起来问题在于
RefreshIndicator
如何处理从 onRefresh
返回的未来。当您调用 retryFunction
时,它应该返回一个 Future<void>
,该值在获取完成后完成。
这里有一个快速解决方案:
onRefresh
回调确保
retryFunction
直接返回 Future<void>
:
onRefresh: () async {
if (!isLoading) {
await retryFunction(); // Wait for the function to complete
}
},
retryFunction
确保
retryFunction
调用 initializations
并返回其 future:
Future<void> retryFunction() {
return initializations();
}
确保您的提供商功能正确完成未来:
Future<void> fetchSinglePostInfo(String id) async {
try {
state = BaseState.loading(data: state.data);
final value = await safeRepo.fetchPostDetails(id);
state = BaseState.success(SafePostModel.fromJson(value["data"]["formattedPost"]));
} catch (e) {
state = BaseState.error(e.toString(), data: state.data);
}
}
这应该确保
RefreshIndicator
旋转,直到抓取完成。