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. 称骨算命免费api接口_json数据接口示例_八字称骨测算程序php接口

    称骨算命是算命方法的一种,和生辰八字算命.紫微斗数算命异曲同工,略有不同,虽然都是用出生的时间算命,但比较而言,称骨算命将命运分的比较粗略,只是把命运分为五十一种.故对命运的考察不细致,不太准确,可以 ...

  2. 批量解压zip文件到指定位置

    话不多说,直接上代码. # coding:utf-8 import zipfile import utils_file n = 21 # 我事先知道我有多少个文件,所以确定为21 for i in r ...

  3. 简单 webapi 登录成功就返回 电脑的进程信息·

    /// <summary> /// 如果登录成功就返回电脑的进程信息 /// </summary> /// <returns></returns> [H ...

  4. vue-template-admin 模板

    1. 替换登录页的样式 2. settings.js 3. layout 文件夹 4. store 文件夹 4.1 app.js

  5. CEOI2022

    Day1 T1 Abracadabra 题意:给你一个 \(1 \sim n\) 的排列 \(p\),保证 \(n\) 为偶数,我们对它进行足够多次数的洗牌操作,定义一次洗牌为: 考虑取出 \(p_{ ...

  6. Java中重写equals并重写hashcode方法的描述

    1.两个对象的hashCode()相同,equals()不一定为true (1)重写equals()的同时,重写hashCode() a.定义Person类,私有属性name,age:有参构造,set ...

  7. HTML5+CSS3+JavaScript网页实战

    1. HTML5基础 HTML5,作为构建和呈现网页内容的标准标记语言,带来了许多革命性的变化.它不仅提供了更加语义化的标签,使得网页内容更具可读性和可访问性,还增加了对多媒体的原生支持,无需依赖第三 ...

  8. 2个月搞定计算机二级C语言——真题(6)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题 6 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> unsigned long f ...

  9. "安装VMware Tools"显示灰色的解决办法

    用VMware Workstation Pro好几年了,期间这个问题也遇到过好几次,这次把解决方案记录一下,若后续有其他情况其他解决方案将在此博文更新. Step1:关闭虚拟机: Step2:在虚拟机 ...

  10. 模态内重叠优化,简单有效的CLIP微调方法 | BMVC'24 Oral

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: CLIP Adaptation by Intra-modal Overlap Reduction 论文地址:https://arxiv.org ...