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先返回的時候,返回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.pswp.cn/pingmian/72176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72176.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RGV調度算法

1、基于時間窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校數學建模挑戰賽B題 2019-mathorcupB題-環形穿梭機調度模型&a…

基于CATIA VBA與Python的自動化音樂生成技術對比研究

在工程軟件二次開發領域&#xff0c;CATIA 也可以許多另類的玩法。通過CATIA自帶的VBA可以演奏歌曲&#xff0c;但實際效果往往差強人意。為了進一步優化實際演奏效果&#xff0c;本文以自動生成林宥嘉《說謊》鋼琴前奏旋律為案例&#xff0c;探討兩種語言在多媒體控制領域的技…

最大數位置(信息學奧賽一本通-2038)

【題目描述】 輸入n個整數,存放在數組a[1]至a[n]中&#xff0c;輸出最大數所在位置(n≤1000)。 【輸入】 第一行&#xff0c;數的個數n; 第二行&#xff0c;n個正整數&#xff0c;每個數在232?1之內。 【輸出】 最大數所在位置。 【輸入樣例】 5 67 43 90 78 32 【輸出樣例】 …

【AIGC】OpenAI 集成 Langchain 操作實戰使用詳解

目錄 一、前言 二、前置準備 2.1 安裝 Langchain必須的依賴 2.1.1 python環境 2.1.2 langchain openai 環境 2.1.3 準備一個apikey 2.1.4 langchain 核心組件 三、Langchain 各組件使用 3.1 Chat models組件 3.1.1 Invocation 使用 3.1.1.1 結果解析 3.2 提示詞模板…

【C#學習筆記04】深入掌握C語言格式化輸出

引言 ??printf()??函數不僅可以將數據輸出到控制臺&#xff0c;還可以通過格式化字符串靈活地控制輸出的格式。??printf()???函數的使用規則&#xff0c;包括標志說明、字段寬度、轉換精度、長度修飾、轉換說明、轉義字符和返回結果等內容。 1. ??printf()??函數…

python-leetcode-定長子串中元音的最大數目

1456. 定長子串中元音的最大數目 - 力扣&#xff08;LeetCode&#xff09; 可以使用 滑動窗口 方法來解決這個問題。步驟如下&#xff1a; 初始化&#xff1a;計算前 k 個字符中元音字母的個數&#xff0c;作為初始窗口的值。滑動窗口&#xff1a;遍歷字符串&#xff0c;每次右…

藍橋真題講解

第一題 題目鏈接 0貪吃蛇長度 - 藍橋云課 題目解析 題意&#xff1a;數#個數和個數再加上首尾 代碼原理 略 代碼編寫 略 填空題技巧 眼看手數 當然并不是真的一個一個數&#xff0c;我們需要借助一些工具&#xff0c;不過各位小伙伴們放心&#xff0c;我們借助的工具…

【C++ 函數模板】—— 模板參數推導、實例化策略與編譯優化

歡迎來到ZyyOvO的博客?&#xff0c;一個關于探索技術的角落&#xff0c;記錄學習的點滴&#x1f4d6;&#xff0c;分享實用的技巧&#x1f6e0;?&#xff0c;偶爾還有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原創??&#xff0c;感謝支持??&#xff01;請尊重原創&#x1…

Java基礎入門流程控制全解析:分支、循環與隨機數實戰

引言 流程控制是編程語言的核心邏輯結構&#xff0c;決定了程序的執行順序與邏輯判斷能力。本文以 分支結構、循環結構 和 隨機數生成 為核心&#xff0c;結合代碼示例與底層原理&#xff0c;全面解析Java中流程控制的應用場景與實戰技巧。 一、分支結構 1. if分支 作用&am…

Redis 數據持久化之RDB

Redis數據持久化策略 持久化策略之RDB RDB:在指定的時間間隔&#xff0c;執行數據集的時間點快照。 實現類似照片記錄效果的方式&#xff0c;就是把某一時刻的數據和狀態以文件的形式寫到磁盤上&#xff0c;也就是讀快照。這樣一來即使故障宕機&#xff0c;快照文件也不會丟失&…

數據分析與AI丨AI Fabric:數據和人工智能架構的未來

AI Fabric 架構是模塊化、可擴展且面向未來的&#xff0c;是現代商業環境中企業實現卓越的關鍵。 在當今商業環境中&#xff0c;數據分析和人工智能領域發展可謂日新月異。幾乎每天都有新興技術誕生&#xff0c;新的應用場景不斷涌現&#xff0c;前沿探索持續拓展。可遺憾的是&…

MyBatis - XML 操作動態 SQL

目錄 1. 前言 2. 動態插入 2.1 if 標簽 2.2 trim 標簽 2.2.1 注解完成動態 SQL 3. 動態查詢 3.1 添加 1 1 3.2 where 標簽 4. 動態更新 4.1 set 標簽 5. foreach 標簽 6. sql 標簽 & include 標簽 1. 前言 之前博文所講的 MyBatis SQL 操作, 都必須按照注解或…

【最佳實踐】Go 責任鏈模式實現參數校驗

這里我們使用責任鏈模式來創建一個參數校驗的示例。在這個示例中&#xff0c;我們將實現一個簡單的責任鏈來校驗不同的參數條件。這種模式允許我們將多個校驗步驟串聯在一起&#xff0c;以便可以在不同的條件下進行靈活的校驗。 設計思路 接口定義 (Validator) 目的&#xff1…

深入理解Tomcat:Java Web服務器的安裝與配置

大家好&#xff01;今天我們來聊聊Java Web開發中最重要的工具之一——Apache Tomcat。Tomcat是一個開源的Java Servlet容器和Web服務器&#xff0c;它是運行Java Web應用程序的核心環境。無論是開發、測試還是部署Java Web應用&#xff0c;Tomcat都是不可或缺的工具。本文將詳…

小程序酒店:如何實現智能預訂與在線支付?

在移動互聯網快速發展的今天,酒店行業面臨著前所未有的機遇與挑戰。用戶需求日益多樣化,市場競爭愈發激烈,傳統酒店預訂方式已經難以滿足現代消費者的需求。而小程序作為一種輕量化、便捷化的移動應用形式,正在成為酒店行業數字化轉型的重要工具。通過小程序開發,酒店可以…

C#實現AES-CBC加密工具類(含完整源碼及使用教程)

一、AES-CBC加密應用場景 AES&#xff08;Advanced Encryption Standard&#xff09;作為全球公認的安全加密標準&#xff0c;廣泛使用在以下場景&#xff1a; API通信加密&#xff1a;保護HTTP接口傳輸的敏感數據&#xff08;如身份令牌、支付信息&#xff09;文件安全存儲&…

docker-compose部署MongoDB分片集群

前言 MongoDB 使用 keyFile 進行 節點間身份驗證,我們需要先創建一個 keyFile 并確保所有副本集的節點使用相同的 keyFile。 openssl rand -base64 756 > mongo-keyfile chmod 400 mongo-keyfiledocker-compose部署分片集群 無密碼方式 # docker-compose-mongodb.yml s…

3-003:在 MySQL 中建索引時需要注意哪些事項?

在 MySQL 中創建索引時&#xff0c;需要注意以下事項&#xff0c;以確保索引高效且合理&#xff1a; 1. 選擇合適的索引類型 主鍵索引&#xff08;PRIMARY KEY&#xff09;&#xff1a;每個表只能有一個&#xff0c;默認是聚簇索引。唯一索引&#xff08;UNIQUE&#xff09;&…

在 Linux 系統中,區分**磁盤(物理/虛擬存儲設備)和分區(磁盤的邏輯劃分)

在 Linux 系統中&#xff0c;區分**磁盤&#xff08;物理/虛擬存儲設備&#xff09;和分區&#xff08;磁盤的邏輯劃分&#xff09;**是管理存儲的基礎。以下是詳細的區分方法和操作示例&#xff1a; 一、通過設備命名規則區分 Linux 中磁盤和分區的命名遵循特定規則&#xff…

MongoDB中的游標(Cursor)

游標&#xff08;Cursor&#xff09;在MongoDB中是一個重要的概念&#xff0c;它用于逐條遍歷查詢結果集&#xff0c;特別適用于處理大量數據時。 一、游標的定義與作用 定義&#xff1a; 游標是一種能從數據記錄的結果集中每次提取一條記錄的機制。在MongoDB中&#xff0c;游…