首页 > 解决方案 > 如何在 RxDart 中重试流?

问题描述

我是 Dart 和 Flutter 的新手,我面临着一个障碍。

我正在用 Flutter 开发一个应用程序,它使用网络调用、令牌认证等。我使用 Dio 和 RxDart。问题是,默认情况下,我需要重试每个 api 调用 5 次,直到我从服务器获得正确的响应(例如,当我调用令牌服务器时,第一次调用响应 202,第二次或第三次调用响应 200)。如何重试呼叫?

这是我的 GET 方法:

  Future _get(String url, {Map<String, dynamic> headers}) async {
    var response = await dio.get(url, options:
    new Options(headers: headers));
    return response.data;
  }

和一个返回 Future Observable 的方法:

 Observable get2(String url, {Map<String, dynamic> headers}) {
return Observable.retry(_sourceStream(url, headers: headers) , 5);

}

 Stream Function() _sourceStream(String url, {Map<String, dynamic> headers}) {
return  () => Observable.fromFuture(_get(url, headers: headers));

}

我知道 RxDart 中有一个 retryWhen 工厂方法,但我无法以正确的方式使用我的方法。任何人都可以帮忙吗?

标签: flutterdartreactive-programmingrxdart

解决方案


使用Observable.retry

Observable.retry(() => Observable.fromFuture(_get(url, headers: headers)), 5)

使用RetryWhenStream

    int retries = 0;
    RetryWhenStream(
      () => Observable.fromFuture(_get(url, headers: headers))),
      (e, s) {
        retries+=1;
        // if there is more than 5 retries, throw an error
        if (retries <= 5) return Observable.just('Lets retry again');
        return Observable.error(e);
      },
    );

当有人开始收听这些流时,它将开始重试 5 次(如果有错误)


推荐阅读