刷新指示器移除得太早

问题描述 投票:0回答:1

问题是当我使用 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);
    }
  }
flutter
1个回答
0
投票

听起来问题在于

RefreshIndicator
如何处理从
onRefresh
返回的未来。当您调用
retryFunction
时,它应该返回一个
Future<void>
,该值在获取完成后完成。

这里有一个快速解决方案:

  1. 调整
    onRefresh
    回调

确保

retryFunction
直接返回
Future<void>

onRefresh: () async {
  if (!isLoading) {
    await retryFunction(); // Wait for the function to complete
  }
},
  1. 更新
    retryFunction

确保

retryFunction
调用
initializations
并返回其 future:

Future<void> retryFunction() {
  return initializations();
}
  1. 提供者功能

确保您的提供商功能正确完成未来:

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
旋转,直到抓取完成。

© www.soinside.com 2019 - 2024. All rights reserved.