当前位置: 首页 > news >正文

flutter dio库 源码赏析

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

http://www.dtcms.com/a/64997.html

相关文章:

  • Java继承机制深度解析:子类如何继承父类及内存原理解析
  • 《A Gentle Introduction to Graph Neural Networks》-GNN的综述性论文
  • 玩转python:掌握Python数据结构之Trie树
  • Django部署Filemanagement
  • Next.js介绍(React框架)
  • 32- 两数之和 II - 输入有序数组
  • AutoGen学习笔记系列(十四)Advanced - Serializing Components
  • OpenSSL 的主要功能及其示例命令
  • Python 文件和异常(存储数据)
  • tomcat部署springboot+vue(不使用nginx)
  • 【深度学习】多源物料融合算法(一):量纲对齐常见方法
  • 贪心算法(5)(java)k次取反后最大化的数组和
  • git 撤销某次提交的上交到远程服务器的commit提交,此提交后面的commit需要保留【deeepseek生成】
  • 【SOC 芯片设计 DFT 学习专栏 -- Scan chain 和 SDFFs及 EDT】
  • sqli-lab靶场学习(八)——Less26-28
  • Android ANR 监控方法与事件分发耗时优化实战
  • vue的 props 与 $emit 以及 provide 与 inject 的 组件之间的传值对比
  • docker修改了daemon.js文件还是下载不了镜像
  • Android 自定义View之底部导航栏
  • LanceDB快速入门之基本操作与API一览
  • 基于VMware的Ubuntu22.04系统安装和配置以及解决Ubuntu共享文件夹无法实现的问题
  • 优化程序执行时间的核心方法与实战策略
  • 机器学习(吴恩达)
  • MinIO的预签名直传机制
  • UI自动化:seldom框架和Selenium
  • MySQL 优化方案
  • [笔记.AI]KAG(知识增强生成 Knowledge Augmented Generation)
  • 解析Doris编译脚本generated-source.sh的逻辑
  • python-53-分别使用flask和streamlit进行向量存储和检索的服务开发实战
  • 算法分享———进制转换通用算法