1. factory函数
//调用factory构造方法后,实际返回的是Dio的子类
Dio dio = Dio();
abstract class Dio {
factory Dio([BaseOptions? options]) => createDio(options);
}
2. CancelToken
作用:取消操作
CancelToken cancelToken = CancelToken();
//监听取消
cancelToken?.whenCancel.then((dioException) {
//do something
});
//取消
cancelToken.cancel();
//CancelToken简化版本
class CancelToken {
CancelToken();
final Completer<DioException> _completer = Completer<DioException>();
DioException? get cancelError => _cancelError;
DioException? _cancelError;
bool get isCancelled => _cancelError != null;
Future<DioException> get whenCancel => _completer.future;
void cancel([Object? reason]) {
_cancelError = DioException(
reason: reason
);
if (!_completer.isCompleted) {
_completer.complete(_cancelError);
}
}
}
3. listenCancelForAsyncTask
作用:任意可以取消的Future
//cancelToken先取消的时候,返回cancelToken中的e
//future先返回的时候,返回future
static Future<T> listenCancelForAsyncTask<T>(
CancelToken? cancelToken,
Future<T> future,
) {
if (cancelToken == null) {
return future;
}
return Future.any([future, cancelToken.whenCancel.then((e) => throw e)]);
}
4. WeakRefrence
作用:防止内存泄露
///
///方法执行的过程中:operation有两个引用链:
/// 一个是operationWeakReference
/// 另外一个是operation
///方法执行完成后:
/// operation只有一个引用链:operationWeakReference,这个是cancelToken持有的。
/// 假设cancelToken被静态变量持有(一直不释放)、并且operation没有使用WeakReference。
/// 则operation不会被释放(一直存在内存中)。
/// 如果operation关联了socket或者其他稀有资源,慢慢就会导致内存溢出。
*//
void _test() {
Futuren operation = Future();
WeakReference operationWeakReference = WeakReference(operation);
cancelToken?.whenCancel.whenComplete(() {
operationWeakReference.target?.cancel();
});
final response = await operation.value;
}
5. compute
作用:response超过50k,使用isolate将byte[]转换成json
Future<Object?> _decodeUtf8ToJson(Uint8List data) async {
if (data.isEmpty) {
return null;
}
return _utf8JsonDecoder.convert(data);
}
Future _test(Uint8List data) {
final shouldUseIsolate = conentLength >= 50 * 1024;
if (shouldUseIsolate) {//如果大于50K,使用isolate
return compute(
_decodeUtf8ToJson,
data,
);
} else {
return _decodeUtf8ToJson(data)
}
}
6. 引用不同dart文件中的相同方法(区分平台)
//一般情况:引入io_adapter.dart html情况:引入browser_adapter.dart
import 'adapters/io_adapter.dart'
if (dart.library.js_interop) 'adapters/browser_adapter.dart'
if (dart.library.html) 'adapters/browser_adapter.dart' as adapter;
abstract class HttpClientAdapter {
factory HttpClientAdapter() => adapter.createAdapter();
}
版本: dio: 5.8.0