flutter dio库 源码赏析

embedded/2025/3/14 4:23:28/

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


http://www.ppmy.cn/embedded/172413.html

相关文章

数据结构-队列(详解)

目录 一、队列的基本概念二、队列的基本操作三、队列的实现方式1. 数组实现队列2. 链表实现队列 四、队列的应用场景五、总结 一、队列的基本概念 队列是一种特殊的线性表&#xff0c;它只允许在表的一端进行插入操作&#xff0c;在另一端进行删除操作。允许插入的一端称为队尾…

golang中具有 “no copy“的类型

在 Go 语言中&#xff0c;某些类型由于特殊用途或底层实现&#xff0c;可能会被标记为 “no copy”&#xff0c;即它们不能被复制&#xff0c;通常是因为复制会导致意外的行为或错误。这些类型主要包括&#xff1a; 1. sync.Mutex、sync.RWMutex 原因&#xff1a;Mutex 是用于…

Node.js学习分享(下)

Node.js Expressexpress的基本用法创建基本的web服务器监听GET请求监听POST请求把内容响应给客户端获取URL中携带的查询参数获取URL中的动态参数 托管静态资源express.static()托管多个静态资源目录挂载路径前缀 Express路由路由模块化 Express中间件Express中间件的调用流程Ex…

C++零基础LeetCode热题100- 128.最长连续序列

128.最长连续序列 题目描述思路步骤实现代码代码详解提交结果注意 题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路 …

使用curl库编写爬虫程序的指令抓取优质视频

首先&#xff0c;curl本身是一个命令行工具&#xff0c;用来传输数据&#xff0c;支持多种协议&#xff0c;包括HTTP、HTTPS等。用户提到“使用curl库编写爬虫程序”&#xff0c;可能指的是用libcurl库在编程语言中调用&#xff0c;比如Python的pycurl&#xff0c;或者C/C直接使…

PHP前后开发纪录

一.LayUI相关 在LayUI中使用jquery读取本地json文件: // getJSON为直接读取本地文件&#xff0c;要改成调接口$.getJSON(/datafile/enviro-factory.json,function(data){data.forEach(element > {setMarkerLabel(element,T,map)});// setMarkerLabel(data[0],T,map)});二.p…

[Python爬虫系列]bilibili

[Python爬虫系列]bilibili 具体逻辑 bv号 -> 处理多P视频 -> 拿到cid -> sign -> 请求下载&#xff0c;其中sign参考前人算法&#xff08;https://github.com/SocialSisterYi/bilibili-API-collect&#xff09; b站视频下载链接 https://api.bilibili.com/x/pl…

EXCEL IF自动填充功能

使用Excel自动填充端口用途&#xff1a;提升工作效率的技巧 在日常工作中&#xff0c;Excel 是一个非常强大的工具&#xff0c;尤其是在处理大量数据时。通过使用 Excel 的自动填充功能&#xff0c;我们可以快速地为数据添加额外的信息&#xff0c;从而提升工作效率。本文将介…