dio_smart_retry 7.0.1 
dio_smart_retry: ^7.0.1 copied to clipboard
Retry library for Dio and Dio package made with love. By default, the request will be retried only for appropriate retryable http statuses.
Dio Smart Retry #
Flexible retry library for Dio package. This is a next generation of an abandoned dio_retry package. 
By default, the request will be retried only for appropriate retryable http statuses. 
Also, it supports dynamic delay between retries. 
Null Safety.
Contents #
Getting Started for Dio #
- Add package to pubspec.yaml: 
dio_smart_retry: ^7.0.0** - Import package: 
import 'package:dio_smart_retry/dio_smart_retry.dart' 
** For the old dio (ver. 4.+) use dio_smart_retry: ^1.4.0
Usage #
Just add an interceptor to your dio:
final dio = Dio();
// Add the interceptor
dio.interceptors.add(RetryInterceptor(
  dio: dio,
  logPrint: print, // specify log function (optional)
  retries: 3, // retry count (optional)
  retryDelays: const [ // set delays between retries (optional)
    Duration(seconds: 1), // wait 1 sec before first retry
    Duration(seconds: 2), // wait 2 sec before second retry
    Duration(seconds: 3), // wait 3 sec before third retry
  ],
));
/// Sending a failing request for 3 times with 1s, then 2s, then 3s interval
await dio.get('https://mock.codes/500');
See example/dio_smart_retry_example.dart.
Default retryable status codes list #
Responses with these http status codes will be retried by default:
- 408: RequestTimeout
 - 429: TooManyRequests
 - 500: InternalServerError
 - 502: BadGateway
 - 503: ServiceUnavailable
 - 504: GatewayTimeout
 - 440: LoginTimeout (IIS)
 - 460: ClientClosedRequest (AWS Elastic Load Balancer)
 - 499: ClientClosedRequest (ngnix)
 - 520: WebServerReturnedUnknownError
 - 521: WebServerIsDown
 - 522: ConnectionTimedOut
 - 523: OriginIsUnreachable
 - 524: TimeoutOccurred
 - 525: SSLHandshakeFailed
 - 527: RailgunError
 - 598: NetworkReadTimeoutError
 - 599: NetworkConnectTimeoutError It's possible to override this list
 
Disable retry #
It's possible to manually disable retry for a specified request. Use disableRetry extension for that:
final request = RequestOptions(path: '/')
  ..disableRetry = true;
await dio.fetch<String>(request);
or
final options = Options()
  ..disableRetry = true;
await dio.get<String>('/', options: options);
Add extra retryable status codes #
It's possible to add you own retryable status codes. Use retryableExtraStatuses parameter for that. Here is an example:
RetryInterceptor(
  dio: dio,
  retryableExtraStatuses: { status401Unauthorized },
)
or:
RetryInterceptor(
  dio: dio,
  retryableExtraStatuses: { 401 },
)
Override retryable statuses #
It's possible to override default retryable status codes list. Just make new instance of DefaultRetryEvaluator and pass your status codes there. 
Here is an example:
final myStatuses = { status400BadRequest, status409Conflict };
dio.interceptors.add(
  RetryInterceptor(
    dio: dio,
    logPrint: print,
    retryEvaluator: DefaultRetryEvaluator(myStatuses).evaluate,
  ),
);
await dio.get<dynamic>('https://mock.codes/400');
Migrating to 7.0 #
Use MultipartFile instead of MultipartFileRecreatable.
Migrating to 6.0 #
Version 6.0 introduces 2 breaking changes:
MultipartFileRecreatable.filenameis now a named parameterMultipartFileRecreatable.filePathis now removed
To update to the latest version, if you were using the MultipartFileRecreatable constructor, remove the filePath parameter and change filename to a named parameter:
Old:
return MultipartFileRecreatable(
  stream,
  length,
  filename,
  filePath,
);
New:
return MultipartFileRecreatable(
  stream,
  length,
  filename: filename,
);