run<T> static method
Runs an operation with a timeout and up to maxRetries attempts.
Returns an ApiLoadResult indicating success or failure.
Example:
final result = await ApiLoader.run(
() => fetchUserData(),
timeout: Duration(seconds: 10),
maxRetries: 2,
);
Implementation
static Future<ApiLoadResult<T>> run<T>(
Future<T> Function() operation, {
Duration timeout = const Duration(seconds: 10),
int maxRetries = 0,
Duration retryDelay = const Duration(seconds: 1),
}) async {
int attempt = 0;
while (attempt <= maxRetries) {
try {
final result = await operation().timeout(timeout);
return ApiLoadResult.success(result);
} on Exception catch (e) {
final isTimeout = e.toString().contains('TimeoutException');
if (isTimeout) {
if (kDebugMode) {
debugPrint('[SmartSplashKit] ApiLoader: timeout on attempt ${attempt + 1}');
}
if (attempt == maxRetries) return ApiLoadResult.timeout();
} else {
if (kDebugMode) {
debugPrint('[SmartSplashKit] ApiLoader: error on attempt ${attempt + 1}: $e');
}
if (attempt == maxRetries) {
return ApiLoadResult.failure(e.toString());
}
}
attempt++;
if (attempt <= maxRetries) {
await Future.delayed(retryDelay);
}
} catch (e) {
if (attempt == maxRetries) {
return ApiLoadResult.failure(e.toString());
}
attempt++;
await Future.delayed(retryDelay);
}
}
return ApiLoadResult.failure('Unknown error');
}