Flutter package: retry

传送门

This package provides an easy way to retry asynchronous functions. This is often useful to avoid crashing on intermittent errors such as broken connections or temporarily overloaded servers.

这个包提供了一种重试异步函数的简单方法。这通常有助于避免因连接中断或服务器暂时过载等间歇性错误而崩溃。

其实就是当有异常抛出时重试

Google官方的库,但是主页又加了一句

Disclaimer: This is not an officially supported Google product.

免责声明:这不是官方支持的 Google 产品

......

直接使用

simple example:

final response = await retry(
// Make a GET request
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
// Retry on SocketException or TimeoutException
retryIf: (e) => e is SocketException || e is TimeoutException,
);

访问https://google.com,如果报错且此错误为SocketException或者TimeoutException,则重试

一些主要参数

参数 描述
位置参数 需要调用的异步函数
retryIf 如果满足回调条件则重试,不传则只要是Exception就重试
maxAttempts 最大尝试次数
delayFactor 每次重试的延迟时间
randomizationFactor 每次重试的延迟随机浮动百分比

Using RetryOptions

    RetryOptions options = RetryOptions(
delayFactor: const Duration(milliseconds: 400),
randomizationFactor: 0.25,
maxAttempts: 4,
maxDelay: Duration(seconds: 20)); options.retry(
() async {
// Make a HTTP request and return the status code.
final HttpClientRequest request = await client
.getUrl(Uri.parse('https://www.google.cn'))
.timeout(const Duration(seconds: 5));
final HttpClientResponse response =
await request.close().timeout(const Duration(seconds: 5));
await response.drain();
return response.statusCode;
},
retryIf: (Exception e) => e is SocketException || e is TimeoutException,
);

也可以使用RetryOptions来配置参数

加上randomizationFactor每次重试的时间就会上下浮动,比如设置为0.25,maxAttempts设置为8

那么在第一次到第七次重试就会按照以下时间休眠

  • 400 ms +/- 25%
  • 800 ms +/- 25%
  • 1600 ms +/- 25%
  • 3200 ms +/- 25%
  • 6400 ms +/- 25%
  • 12800 ms +/- 25%
  • 25600 ms +/- 25%

完整示例:

Future<void> retryFunction() async {
// Create an HttpClient.
final HttpClient client = HttpClient(); try {
// Get statusCode by retrying a function
final int statusCode = await retry(
() async {
// Make a HTTP request and return the status code.
final HttpClientRequest request = await client
.getUrl(Uri.parse('https://www.google.cn'))
.timeout(const Duration(seconds: 5));
final HttpClientResponse response =
await request.close().timeout(const Duration(seconds: 5));
await response.drain();
return response.statusCode;
},
// Retry on SocketException or TimeoutException
retryIf: (Exception e) =>
e is SocketException || e is TimeoutException,
maxAttempts: 4,
delayFactor: const Duration(seconds: 1),
randomizationFactor: 0.5,
onRetry: (Exception e) {
log('onRetry');
},
maxDelay: const Duration(seconds: 20)); // Print result from status code
if (statusCode == 200) {
if (kDebugMode) {
print('google.com is running');
}
} else {
if (kDebugMode) {
print('google.com is not availble...');
}
}
} finally {
// Always close an HttpClient from dart:io, to close TCP connections in the
// connection pool. Many servers has keep-alive to reduce round-trip time
// for additional requests and avoid that clients run out of port and
// end up in WAIT_TIME unpleasantries...
client.close();
}
}

Flutter Package: retry的更多相关文章

  1. flutter package & pub publish

    flutter package & pub publish dart-library-package https://pub.dev/packages/dart_library_package ...

  2. Flutter 增加三方库卡在flutter package get 的解决办法

    修改 pubspec.yaml 文件增加第三方库之后,AndroidStudio 像往常一样提示 需要 package get. 然后一直卡在 Running "flutter packag ...

  3. Flutter 实现原理及在马蜂窝的跨平台开发实践

    一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如 WebView 和 React Native,来提升开发效率和 ...

  4. flutter插件汇总2

    作者:知乎用户链接:https://www.zhihu.com/question/307594373/answer/568969429来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. Flutter 开发小技巧

    1.命令行运行flutter run之后iOS报错:Could not install build/ios/iphones/Runner.app on XXXXX. try lunching Xcod ...

  6. Flutter Plugin开发流程

    这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...

  7. Flutter 不一样的跨平台解决方案

    本文主要介绍Flutter相关的东西,包括Fuchsia.Dart.Flutter特性.安装以及整体架构等内容. 1. 简介 Flutter作为谷歌最近推出的跨平台开发框架,一经推出便吸引了不少注意. ...

  8. 【Flutter】Flutter 一些常用库

    Flutter社区和资源传送门 新: 慕课网<Flutter入门与案例实战>   |   中文网<Flutter实战>电子书 字体图标生成 http://fluttericon ...

  9. Flutter的需要与原生交互的一些常用库

    [说明]由于这些库一直在更新,请自己选择合适的稳定版本下载. 另外如果发现有问题或者你有更好的库,欢迎留言告诉我. 谷歌官方的针对Dart语言的一些实用性的功能以及扩展的库 -- Quiver Qui ...

  10. 深入理解 Flutter 的编译原理与优化

    阿里妹导读:对于开发者而言,Flutter工程和我们的Android/iOS工程有何差别?Flutter的渲染和事件传递机制如何工作?构建缓慢或出错又如何去定位,修改和生效呢?凡此种种,都需要对Flu ...

随机推荐

  1. iManager for K8S 配置https证书流程步骤

    针对10.1及之前版本,需要手动去配置证书,未来版本会考虑进行界面化配置. 一.提前准备 1. 证书需要准备三个文件 *.key *.crt private.pem 2. 如果没有修改iManager ...

  2. 课时05:Linux必备系统命令

  3. OpenAI 发布适用于 .NET 库的稳定版本

    OpenAI 在 6 月发布测试版后发布了其官方 .NET 库的稳定版本.它以 NuGet 包的形式提供,支持 GPT-4o 和 GPT-4o mini 等最新模型,以及完整的 OpenAI REST ...

  4. USB gadget驱动框架(五)

    本节主要分析虚拟串口的tty设备的注册.创建/dev/ttyGSx设备节点.tty相关接口的实现. tty的申请与注册 源码:drivers/usb/gadget/function/u_serial. ...

  5. UEFI原理与编程(四)(dec dsc inf文件)

    1 .inf文件 以下面 .inf文件为例 [Defines] # 块用于定义模块的属性和其他变量,块内定义的变量可被其他块引用 INF_VERSION = 0x00010006 #INF 标准的版本 ...

  6. iOS中MJExtension使用详解

    iOS开发中MVC模式最为常见,M代表模型,字典转成模型数据可以简化很多操作,下面我们说一下具体用法. 1.将字典转换成模型对象,模型中的属性名和responseObject字典中的字段名一致,我们得 ...

  7. C#/.NET/.NET Core优秀项目和框架2024年9月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...

  8. 39. 关于 diff 算法

    diff 算法是vue渲染列表数据的时候,把新的 Vnode 和旧的 Vnode 比较,通过 key 值的对应,变化的标签就更新视图,不变的就复用 :

  9. 《Programming from the Ground Up》读后感

    之所以看这本书,是想了解一些跟汇编相关的知识,打开这本书后就被作者的观点--"If you don't understand something the first time, reread ...

  10. [NOI Online 2022 入门组] 数学游戏

    P8255 [NOI Online 2022 入门组] 数学游戏 注:妙哉,此题可以理解为数学题. 思路 由题易得: \[\notag z=d_x\times d_y\times \gcd(x,y)^ ...