Flutter网络请求重试插件retry的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter网络请求重试插件retry的使用

简介

retry 包提供了一种简单的方法来重试异步函数。这通常用于避免因间歇性错误(如断开的连接或暂时过载的服务器)而导致崩溃。

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

使用 retry

对于简单的重试逻辑与指数退避,可以使用此包提供的 retry 函数。

import 'package:retry/retry.dart';
import 'package:http/http.dart' as http;

void main() async {
  final response = await retry(
    // 执行一个GET请求
    () => http.get(Uri.parse('https://google.com')).timeout(Duration(seconds: 5)),
    // 当遇到SocketException或TimeoutException时重试
    retryIf: (e) => e is SocketException || e is TimeoutException,
  );
  print(response.body);
}

默认情况下,它会尝试8次,在第1、2、3……7次尝试后分别等待:

  1. 400 ms ± 25%
  2. 800 ms ± 25%
  3. 1600 ms ± 25%
  4. 3200 ms ± 25%
  5. 6400 ms ± 25%
  6. 12800 ms ± 25%
  7. 25600 ms ± 25%

使用 RetryOptions

该包还提供了 RetryOptions 来定义重试次数和每次重试之间的等待时间。

import 'package:retry/retry.dart';
import 'package:http/http.dart' as http;

void main() async {
  final r = RetryOptions(maxAttempts: 8);
  final response = await r.retry(
    // 执行一个GET请求
    () => http.get(Uri.parse('https://google.com')).timeout(Duration(seconds: 5)),
    // 当遇到SocketException或TimeoutException时重试
    retryIf: (e) => e is SocketException || e is TimeoutException,
  );
  print(response.body);
}

示例代码

下面是一个完整的示例代码,演示了如何在Flutter中使用 retry 插件进行网络请求并处理异常。

import 'dart:async';
import 'dart:io';
import 'package:retry/retry.dart';
import 'package:http/http.dart' as http;

Future<void> main() async {
  try {
    // 获取状态码,并在发生特定异常时重试
    final statusCode = await retry(
      () async {
        // 执行HTTP请求并返回状态码
        final response = await http.get(Uri.parse('https://www.google.com')).timeout(Duration(seconds: 5));
        return response.statusCode;
      },
      // 在遇到SocketException或TimeoutException时重试
      retryIf: (e) => e is SocketException || e is TimeoutException,
    );

    // 根据状态码打印结果
    if (statusCode == 200) {
      print('google.com is running');
    } else {
      print('google.com is not available...');
    }
  } catch (e) {
    print('An error occurred: $e');
  }
}

这个例子展示了如何创建一个HTTP客户端,执行带超时设置的GET请求,并在遇到特定类型的异常时自动重试。通过这种方式,可以提高应用在网络不稳定情况下的鲁棒性。


更多关于Flutter网络请求重试插件retry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求重试插件retry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,处理网络请求时可能会遇到各种临时性问题,如网络不稳定、服务器响应超时等。为了解决这些问题,开发者通常会实现请求重试机制。retry 插件是一个流行的解决方案,它允许我们在网络请求失败时自动进行重试。

以下是如何在Flutter中使用 retry 插件来进行网络请求重试的示例代码。假设我们使用的是 dio 库来进行HTTP请求,因为 dio 提供了很好的扩展性,可以与 retry 插件很好地集成。

首先,确保在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 请根据需要选择最新版本
  retry: ^3.1.0  # 请根据需要选择最新版本

然后,运行 flutter pub get 来安装这些依赖。

接下来,我们编写代码来实现带有重试机制的网络请求:

import 'package:dio/dio.dart';
import 'package:retry/retry.dart';

void main() async {
  // 创建 Dio 实例
  final dio = Dio();

  // 定义重试策略
  final retryOptions = RetryOptions(
    maxAttempts: 5, // 最大重试次数
    delayFactor: const Duration(seconds: 1), // 每次重试前的延迟时间
    maxDelay: const Duration(seconds: 10), // 最大延迟时间
    randomize: true, // 是否随机化延迟时间
  );

  // 使用 retry 包封装请求函数
  final result = await retry(
    () async {
      try {
        // 发起网络请求
        final response = await dio.get('https://api.example.com/data');
        // 如果请求成功,返回响应数据
        return response.data;
      } catch (e) {
        // 如果请求失败,抛出异常以便重试
        throw e;
      }
    },
    retryOptions: retryOptions,
  );

  // 处理请求结果
  print('Request Result: $result');
}

在这个示例中:

  1. 我们首先创建了一个 Dio 实例用于发起HTTP请求。
  2. 然后定义了一个 RetryOptions 对象,配置最大重试次数、延迟时间等参数。
  3. 使用 retry 函数封装了实际的请求逻辑。retry 函数会尝试执行传入的闭包(即我们的请求逻辑),如果抛出异常,则根据 RetryOptions 配置进行重试。
  4. 最后,打印请求结果。

注意:retry 函数来自 retry 包,而 dio.getdio 库提供的HTTP GET请求方法。这个示例假设服务器返回的是JSON数据,因此 response.data 获取的是解析后的数据。

通过这种方式,你可以轻松地在Flutter应用中实现网络请求的重试机制,提高应用的健壮性和用户体验。

回到顶部