import 'dart:math'; /// 重试处理器,支持指数退避策略 class RetryHandler { static const int maxRetries = 3; static const Duration initialDelay = Duration(seconds: 1); static const double exponentialBase = 2.0; /// 执行带重试的异步操作 /// /// [operation] 要执行的异步操作 /// [retryIf] 可选的条件函数,返回true时才重试 /// [maxAttempts] 最大尝试次数,默认为3次 /// [onRetry] 可选的重试回调,参数为当前尝试次数和错误 static Future retry({ required Future Function() operation, bool Function(dynamic error)? retryIf, int maxAttempts = maxRetries, void Function(int attempt, dynamic error)? onRetry, }) async { int attempt = 0; dynamic lastError; while (true) { try { attempt++; return await operation(); } catch (e) { lastError = e; // 检查是否应该重试 if (attempt >= maxAttempts || (retryIf != null && !retryIf(e))) { rethrow; } // 计算延迟时间(指数退避) final delay = initialDelay * pow(exponentialBase, attempt - 1); // 调用重试回调 if (onRetry != null) { onRetry(attempt, e); } // 等待后重试 await Future.delayed(delay); } } } /// 判断错误是否应该重试(网络相关错误) static bool shouldRetryOnError(dynamic error) { // 可以根据具体错误类型判断是否应该重试 // 例如:网络超时、连接失败等应该重试 // 认证失败、参数错误等不应该重试 final errorStr = error.toString().toLowerCase(); // 应该重试的错误类型 if (errorStr.contains('timeout') || errorStr.contains('connection') || errorStr.contains('network') || errorStr.contains('socket')) { return true; } // 不应该重试的错误类型 if (errorStr.contains('authentication') || errorStr.contains('unauthorized') || errorStr.contains('forbidden') || errorStr.contains('invalid')) { return false; } // 默认重试 return true; } }