This document gathered all breaking changes and migrations requirement between versions.
- All request will not imply the default content type by default, leave to users to handle.
getandgetUriinDiohas different signature.DefaultHttpClientAdapteris now namedIOHttpClientAdapter, and the platform independent adapter can be initiated byHttpClientAdapter()which is a factory method.- Adapters that extends
HttpClientAdaptermust nowimplementsinstead ofextends. DioErrorhas separate constructors and all fields are annotated as final.DioErrorTypehas different values.- Imports are split into new libraries:
dio/io.dartis for natives specific classes;dio/browser.dartis for web specific classes.
connectTimeout,sendTimeout, andreceiveTimeoutare nowDurationinstead ofint.
Now you'll need to specify the content type in the BaseOptions
or in every requests' Options or headers. To do so:
- In
BaseOptions:dio.options.contentType = Headers.jsonContentType;
- In
Options:dio.get('some/path', options: Options(contentType: Headers.jsonContentType));
- In headers:
dio.get( 'some/path', options: Options( headers: {Headers.contentTypeHeader: Headers.jsonContentType}, ), );
If you have your own request method that wraps diox:
void request(
Uri uri, {
Map<String, String?>? queryParameters,
Object? body,
Map<String, dynamic>? headers,
Options? options,
ResponseType? responseType = ResponseType.json,
}) {
if (body != null) {
// If you have `content-type` in `headers`, it will be use first.
options.contentType ??= Headers.jsonContentType;
}
} Future<Response<T>> get<T>(
String path, {
+ Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onReceiveProgress,
}); Future<Response<T>> getUri<T>(
Uri uri, {
+ Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onReceiveProgress,
});Before:
void initAdapter() {
final dio = Dio();
// For natives.
dio.httpClientAdapter = DefaultHttpClientAdapter();
// For web.
dio.httpClientAdapter = BrowserHttpClientAdapter();
}After:
void initAdapter() {
final dio = Dio();
// Universal adapter that create the adapter for the corresponding platform.
dio.httpClientAdapter = HttpClientAdapter();
// For natives.
dio.httpClientAdapter = IOHttpClientAdapter();
// For web.
dio.httpClientAdapter = BrowserHttpClientAdapter();
}Before:
class ExampleAdapter extends HttpClientAdapter { /* ... */ }After:
class ExampleAdapter implements HttpClientAdapter { /* ... */ }Before:
Never throwDioError() {
final error = DioError(request: requestOptions, error: err);
error.message = 'Custom message.';
error.stackTrace = StackTrace.current;
throw error;
}After:
Never throwDioError() {
DioError error = DioError(
request: requestOptions,
error: err,
stackTrace: StackTrace.current
);
error = error.copyWith(message: 'Custom message.');
throw error;
}| Before | After |
|---|---|
| N/A | badCertificate |
| response | badResponse |
| connectTimeout | connectionTimeout |
| other | unknown |
Before:
void request() {
final dio = Dio(
BaseOptions(
connectTimeout: 5000,
sendTimeout: 5000,
receiveTimeout: 10000,
),
);
}After:
void request() {
final dio = Dio(
BaseOptions(
connectTimeout: const Duration(seconds: 5),
sendTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 10),
),
);
}- Null safety support (Dart >= 2.12).
- The
InterceptorAPIs signature has changed. - Rename
options.mergetooptions.copyWith. - Rename
DioErrorTypeenums from uppercase to camel style. - Delete
dio.resolveanddio.rejectAPIs (usehandlerinstead in interceptors). - Class
BaseOptionsno longer inherits fromOptionsclass. - Change
requestStreamtype ofHttpClientAdapter.fetchfromStream<List<int>>toStream<Uint8List>. - Download API: Add real uri and redirect information to headers.