Flutter可取消重试功能插件cancelable_retry的使用

Flutter可取消重试功能插件cancelable_retry的使用

pub package Analyze & Test innim lint

Utility for wrapping an asynchronous function in automatic retry logic with ability to cancel it.

特性

允许在某些条件下自动重试请求。重试逻辑采用指数退避算法,适用于网络请求。如果你不需要继续重试,可以取消重试。在这种情况下,将返回最后一次的结果。

开始使用

要使用此插件,在你的 pubspec.yaml 文件中添加 cancelable_retry 作为依赖项。

dependencies:
  cancelable_retry: ^1.0.0

使用示例

创建一个 CancelableRetry 实例并调用 run() 方法:

import 'package:cancelable_retry/cancelable_retry.dart';

// 创建 CancelableRetry 实例
final request = CancelableRetry(
  // 提供请求函数
  () => doSomeRequest(),
  // 设置重试条件
  retryIf: (result) => result == "retry",
  // 可选参数:
  // - 定义最大重试次数
  maxAttempts: 8,
  // - 定义最大重试延迟时间
  maxDelay: const Duration(seconds: 30),
  // - 调整重试之间的延迟时间
  delayFactor: const Duration(milliseconds: 200),
  randomizationFactor: 0.25,
);

// 执行请求
final res = await request.run();

如果你想取消重试,只需调用 cancel() 方法:

await request.cancel();

完整示例

以下是一个完整的示例,展示了如何使用 cancelable_retry 插件来实现可取消的重试功能:

// ignore_for_file: avoid_print

import 'package:async/async.dart';
import 'package:cancelable_retry/cancelable_retry.dart';

var _num = 0;

Future<void> main() async {
  // 创建 CancelableRetry 实例
  final request = CancelableRetry<Result<String>>(
    _request,
    retryIf: (r) => r.isError && r.asError!.error == 'retry',
  );

  // 执行请求
  final res = await request.run();

  // 打印结果
  print(res.isValue
      ? 'Result: ${res.asValue!.value}'
      : 'Error: ${res.asError!.error}');
}

// 请求函数
Future<Result<String>> _request() async {
  _num++;
  print('Request #$_num');
  await Future<void>.delayed(const Duration(milliseconds: 100));
  if (_num < 3) {
    return Result.error('retry');
  } else {
    return Result.value('success');
  }
}

更多关于Flutter可取消重试功能插件cancelable_retry的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可取消重试功能插件cancelable_retry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


cancelable_retry 是一个 Flutter 插件,用于在异步操作失败时支持重试,并且允许用户取消重试操作。这在处理网络请求或其他可能失败的异步任务时非常有用。通过 cancelable_retry,你可以轻松地实现重试逻辑,并在用户不需要继续重试时取消操作。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 cancelable_retry 依赖:

dependencies:
  flutter:
    sdk: flutter
  cancelable_retry: ^1.0.0 # 请使用最新版本

然后运行 flutter pub get 来安装插件。

使用 cancelable_retry

以下是一个简单的示例,展示如何使用 cancelable_retry 来实现可取消的重试功能。

import 'package:flutter/material.dart';
import 'package:cancelable_retry/cancelable_retry.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Cancelable Retry Example')),
        body: Center(
          child: RetryButton(),
        ),
      ),
    );
  }
}

class RetryButton extends StatefulWidget {
  [@override](/user/override)
  _RetryButtonState createState() => _RetryButtonState();
}

class _RetryButtonState extends State<RetryButton> {
  CancelableOperation? _cancelableOperation;

  Future<void> _performTask() async {
    // 模拟一个可能失败的任务
    try {
      await _cancelableOperation = retry(
        () async {
          // 这里放置你的异步操作
          await Future.delayed(Duration(seconds: 1));
          if (DateTime.now().second % 2 == 0) {
            throw Exception('任务失败');
          }
          print('任务成功');
        },
        maxAttempts: 5, // 最大重试次数
        delay: Duration(seconds: 1), // 重试延迟
        onRetry: (attempt) {
          print('重试次数: $attempt');
        },
      );
    } catch (e) {
      print('任务最终失败: $e');
    }
  }

  void _cancelTask() {
    _cancelableOperation?.cancel();
    print('任务已取消');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _performTask,
          child: Text('开始任务'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _cancelTask,
          child: Text('取消任务'),
        ),
      ],
    );
  }
}
回到顶部