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先返回的時候,返回futurestatic 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,使用isolatereturn 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