dio
dio copied to clipboard
Docs for merging between `Options` and `BaseOptions` are not clear
Request Statement
I want to reuse my dio
instance, to take advantage of all the interceptors, timeouts and other things that were configured inside it. I have one HTTP GET request that needs to be done in another base URL tough, so I need to modify the base URL and the responseType
. I tried this, but it doesn't work:
final options = Options().compose(dio.options.copyWith(baseUrl: '', responseType: ResponseType.bytes), url);
final response = await dio.get<Uint8List?>(url, options: options);
The idea was to create a new options
object that has all the current options of my dio
instance, just changing the baseUrl
and responseType
. This doesn't work because compose
returns a RequestOptions
and get
needs an Options
object.
The kinds of objects that dio
creates limits the flexibility of the package and makes the API kinda confuse.
The only way I managed to get this to work was by doing:
final options = Options().compose(
dio.options.copyWith(
baseUrl: '',
method: 'GET',
responseType: ResponseType.bytes,
),
url,
);
final response = await dio.fetch<Uint8List?>(options);
Solution Brainstorm
No response
Pseudo:
const baseDartUrl = 'https://dart.dev';
const baseFlutterUrl = 'https://flutter.dev';
void main() async {
final dio = Dio(BaseOptions(baseUrl: baseDartUrl));
final requestWithDart = await dio.get('/');
final requestWithFlutter = await dio.get('$baseFlutterUrl/');
}
I have a genetic method that makes requests to a complete url variable. I remember passing the variable to get
and it would append my base url to the url and it would fail.
Also, how do you change the ResponseType
?
I have a genetic method that makes requests to a complete url variable. I remember passing the variable to
get
and it would append my base url to the url and it would fail.
Would be good if you could provide a reproducible case.
Also, how do you change the
ResponseType
?
Each request can specify ResponseType
in their Options
.
But that option I am proving is a new option, so wouldn't it override the values in my default option I used for constructing the dio instance?
But that option I am proving is a new option, so wouldn't it override the values in my default option I used for constructing the dio instance?
Of course Options
overrides BaseOptions
, but it only happens in that request, rather than further requests.
But I want that request to carry all the options provided in the base options, only overriding the ones I need to change, not all of them.
I'm wondering if you really tried to use Options
. It works just as you want it to. :)
Given the above conversation, I think your usage might be invalid somehow. I cannot provide suggestions unless there is an actual problem with options, and please provide a reproducible example to explain your demand.
@AlexV525 I tested and indeed it worked, I think the docs got me confused, the docs say:
Each Dio instance has a base config for all requests made by itself, and we can override the base config with Options when make a single request.
The word "override" implies that all my Base Options are gone. I thought I would have to recreate all the configurations myself, from both options objects.
I would recommend some more details to ba added to this doc, explaining the options objects are merged, where the items defined inside the new options object will override the fields defined inside the base options.
Each Dio instance has a base config for all requests made by itself, and we can override the base config with Options when make a single request.
The word "override" implies that all my Base Options are gone. I thought I would have to recreate all the configurations myself, from both options objects.
I'm not sure it implies the idea you've mentioned. No default values were given in the Options
, thus nothing would be override when you are using an empty Options
. https://pub.dev/documentation/dio/latest/dio/Options-class.html
I know that's how the code looks like, but reading the docs that's not clear. The internal code could be easily overriding things with nulls.
Override means substitute, merge means combine both into one.
Yea, I can see that this might be confusing. Feel free to create a PR to update the documentation!