import 'package:dio/dio.dart';void getHttp() async {try {var response = await Dio().get('http://www.google.com');print(response);} catch (e) {print(e);}}
Overview

Dio 底层是叫做 HttpClientAdapter 的抽象类,这个类只定义了一个方法 fetch ,通过 option 去调整请求的参数,上层是 DioMinix 的 Mixin 类,实现了 Get , Post 等方法对于fetch 的封装,并且完成了各个功能的接入,比如 FormData 类型的编码,Interperceptor 的调用等,
Interceptor

Interceptor 是 Dio 中的拦截器, Interceptor 需要定义三种方法 onRequest , onResponse , onError ,
定义好的 Interceptor 会进入到 Interceptors ,这个类型实现了 ListMixin 抽象类,也就是说可以像操作 List 一样操作它,那为什么不直接使用 List<Interceptor> 呢? Interceptors 除了包含 List 的功能以外,还可以通过 lock/unlock 来锁定,解锁拦截器,保证请求 / 响应的串行执行。由于 dart 没有提供 lock 函数,所以 Dio 就使用 Future 实现了 lock。
class Lock {Future? _lock;late Completer _completer;bool get locked => _lock != null;void lock() {if (!locked) {_completer = Completer();_lock = _completer.future;}}void unlock() {if (locked) {_completer.complete();_lock = null;}}void clear([String msg = 'cancelled']) {if (locked) {_completer.completeError(msg);_lock = null;}}Future? enqueue(EnqueueCallback callback) {if (locked) {// we use a future as a queuereturn _lock!.then((d) => callback());}return null;}}
Cancel Token
Dio 支持 Cancel Token 的功能,Cancel Token 实际上就就是一个 Completer ,调用 cancel 的时候,会调用 Completer 的 complete 方法,
CancelToken token = CancelToken();dio.get(url, cancelToken: token).catchError((DioError err){if (CancelToken.isCancel(err)) {print('Request canceled! '+ err.message)}else{// handle error.}});// cancel the requests with "cancelled" message.token.cancel("cancelled");
