Kotlin Multiplatform--04:經驗總結(持續更新)

Kotlin Multiplatform--04:經驗總結(持續更新)

    • 引言

引言

????????本章用來記載筆者開發過程中的一些經驗總結


一、Ktor設置Header
????????在官方文檔中,想要設置Header的示例代碼如下:

client.get("https://ktor.io") {headers {append(HttpHeaders.Accept, "text/html")append(HttpHeaders.Authorization, "abc123")append(HttpHeaders.UserAgent, "ktor client")}
}

????????但經過筆者多次測試和踩坑,在最新版本的Ktor中,這樣設置Header根本沒用,需要用以下代碼設置:

client.get("https://ktor.io") {headers["User-Agent"] = "ktor client"
}

二、IO與ViewModel
????????ViewModel是Android開發中一個很重要的概念,因為它的存活時間相較于StateHodler更長,所以最適合用來處理業務邏輯。普通的ViewModel不能有任何參數,如下所示:

class MyViewModel: ViewModel() { ... }

????????由于ViewModel存活時間長,因此它不能直接引用Context對象,更不能被其他對象引用。定義了自己的MyViewModel類后,通過以下函數引用MyViewModel對象,哪里需要就在哪里調用,如果沒有這個函數,則需要添加以下依賴:

// androidx.lifecycle:lifecycle-viewmodel-compose
val myViewModel: MyViewModel = viewModel()

????????當viewModel中需要涉及文件讀寫等IO操作時,可以使用viewModelScope和withContext切換到IO線程,防止阻塞UI。示例代碼如下:

class MyViewModel: ViewModel() {fun save(context: Context) {viewModelScope.launch {withContext(Dispatchers.IO) {File(context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "data.json").outputStream().use {it.write(...)}}}}
}

三、測量與布局
????????IntrinsicSize用于控制組件的 固有尺寸測量(intrinsic measurement),它允許你在布局過程中獲取或使用組件的固有寬度或高度。當需要根據子組件的尺寸來約束父組件大小時,可以使用IntrinsicSize實現。
????????例如我有一個父組件Box和兩個子組件Row,其中包含Text組件的Row大小已知,需要讓另一個Row大小一致,此時可以用如下代碼實現:

 Box(Modifier.height(IntrinsicSize.Min)) {Row {Text(value, fontSize = TextUnit(26f, TextUnitType.Sp))}Row(Modifier.fillMaxSize()) {...}}

????????注意事項:
????????1、固有尺寸計算可能會有性能開銷,應避免在性能敏感的場景過度使用。
????????2、并非所有組件都支持固有尺寸(如 LazyColumn 就沒有固有高度)。
????????
四、回調與協程
????????回調函數是非常常見的一種編程范式,在Java中尤為突出。但回調函數一多就會形成回調地獄,不管是開發還是維護都十分痛苦。Kotlin為了解決這一痛點,設計了suspendCoroutine。suspendCoroutine 是 Kotlin 協程中的一個核心函數,用于將傳統的基于回調的異步操作轉換為協程風格的掛起函數。示例代碼如下所示:

// 模擬常見的回調函數
fun someCallbackFun(callback: (String) -> Unit) {callback("myCallback")
}// 正常調用方法
fun callBackMain() {someCallbackFun { println(it)}
}// 協程調用,將非線性程序轉為線性程序
suspend fun coroutineMain() {val retval = suspendCoroutine { coroutine ->someCallbackFun {coroutine.resume(it)}}print(retval)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906396.shtml

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

相關文章

在 Ubuntu 系統中,將 JAR 包安裝為服務

在 Ubuntu 系統中,將 JAR 包安裝為服務可以通過 systemd 來實現。以下是詳細的操作步驟: 準備工作 確保 JAR 文件路徑和 Java 運行時環境已準備好。驗證 Java 是否可用: java -version創建 systemd 服務文件 systemd 的服務文件通常位于 …

電商項目-商品微服務-品牌管理微服務開發

一、功能分析 品牌管理微服務包括: (1)查詢全部列表數據 (2)根據ID查詢實體數據 (3)增加 (4)修改 (5)刪除 (6)分頁…

Spring Boot開發—— 整合Lucene構建輕量級毫秒級響應的全文檢索引擎

文章目錄 一、為什么選擇 Lucene?輕量級搜索的底層密碼二、核心原理:Lucene 的倒排索引2.1 倒排索引:速度之源2.2 段合并優化策略三、Spring Boot集成Lucene實戰3.1 依賴配置3.2 實體與索引設計3.3 核心索引服務(含異常處理)3.4 使用示例(測試類)四、高級優化技巧4.1 索…

SpringBootDay1|面試題

目錄 一、springboot框架 1、什么是springboot 2、Spring Boot的主要優點 3、springboot核心注解 4、定義banner(springboot的logo) 5、springboot配置文件 6、springboot 整合 jdbc 二、面試題 1)springmvc的作用 ?編輯 2&#x…

jQuery Ajax中dataType 和 content-type 參數的作用詳解

jQuery Ajax中dataType與contentType參數解析 一、核心概念對比 參數作用對象數據類型默認值dataType響應數據預期接收的數據格式jQuery自動判斷(根據響應頭MIME類型)contentType請求數據發送數據的編碼格式application/x-www-form-urlencoded 二、da…

幾款常用的虛擬串口模擬器

幾款常用的虛擬串口模擬器(Virtual Serial Port Emulator),適用于 Windows 系統,可用于開發和調試串口通信應用: 1. com0com (開源免費) 特點: 完全開源免費,無功能限制。 可創建多個虛擬串口…

LLM筆記(六)線性代數

公式速查表 1. 向量與矩陣:表示、轉換與知識存儲的基礎 向量表示 (Vectors): 語義的載體 在LLM中,向量 x ∈ R d \mathbf{x}\in\mathbb{R}^d x∈Rd 是信息的基本單元,承載著豐富的語義信息: 詞嵌入向量 (Word Embeddings)&am…

[特殊字符] Word2Vec:將詞映射到高維空間,它到底能解決什么問題?

一、在 Word2Vec 之前,我們怎么處理語言? 在 Word2Vec 出現之前,自然語言處理更多是“工程方法”,例如字符串匹配、關鍵詞提取、正則規則...。但這些表示通常缺乏語義,詞與詞之間看不出任何聯系以及非常淺顯。當然,技術沒有好壞,只有適合的場景。例如: 關鍵詞匹配非常…

棧和隊列的模擬實現

棧和隊列的模擬實現 容器適配器priority_queue(優先級隊列)priority_queue的使用priority_queue的模擬實現: 仿函數什么叫仿函數?需要自己實現仿函數的情況: 棧的模擬實現隊列的模擬實現deque(vector和list的縫合怪&am…

idea本地debug斷點小技巧

idea本地debug斷點小技巧 簡單的設置斷點條件 斷點后,右鍵這個斷點,可以在 condition 中填寫能得出布爾的表達式 a 1 你如果寫如下,表示先給他賦值,然后斷住 a 2; true 斷點后設置某個變量的值 在 debug 區域可以設置變量…

Oracle中如何解決FREE BUFFER WAITS

基于性能上的考慮,服務器進程在掃描LRU主列的同時,會將臟塊移至LRU-W列,如果發現沒有足夠可用(可替換)的BUFFER CACHE,進程并不會無止盡地掃描整條LRU主列,而是在掃描到某個閥值(該閥…

Git命令使用全攻略:從創建分支到合并的完整流程

Git命令使用全攻略:從創建分支到合并的完整流程 引言一、初始化項目與基礎配置1.1 克隆遠程倉庫1.2 查看當前分支狀態 二、創建與管理分支2.1 從main分支創建新功能分支2.2 查看分支列表2.3 提交代碼到新分支2.4 推送分支到GitHub 三、版本發布與標簽管理3.1 創建輕…

MATLAB跳動的愛心

520,一個會動的心~~~ function particleHeart2 % author : slandarer% 所需匿名函數 col1Func(n) repmat([255,158,196]./255,[n,1])repmat([-39,-81,-56]./255,[n,1]).*rand([n,1]); col2Func(n) repmat([118,156,216]./255,[n,1])repmat([137,99,39].*.1./255,[n,…

Go的單測gomock及覆蓋率命令

安裝gomock: go get github.com/golang/mock/gomockgo get github.com/golang/mock/mockgen 使用 mockgen 生成 mock 代碼: 參考 mockgen -sourceservice/user.go -destinationservice /mocks/mock_user_service.go -packagemocks go test -coverprofilecoverage.ou…

vue添加loading后修復頁面渲染問題

問題:想要通過選擇流程(1)后加載出角色信息(2) 選擇后無法展示經過排查,再調用接口給角色數組賦值后,頁面在接口調用完之前就已經渲染完成。接口是采用的異步加載解決:loadingRoles…

Python入門手冊:Python簡介,什么是Python

在當今數字化時代,編程語言猶如一把把神奇的鑰匙,能夠開啟通往技術世界的大門。而Python,無疑是其中最閃耀的一顆明星。今天,就讓我們一起走進Python的世界,從它的起源、應用領域以及優缺點三個方面,來全面…

用PyTorch在超大規模下訓練深度學習模型:并行策略全解析

我猜咱們每個人肯定都累壞了,天天追著 LLM 研究社區跑,感覺每天都冒出個新的最牛模型,把之前的基準都給打破了呢。要是你好奇為啥創新速度能這么快,那主要就是研究人員能夠在超大規模下訓練和驗證模型啦,這全靠并行計算…

提示工程(Prompt Engineering)應用技巧

Prompt(提示)就是用戶與大模型交互輸入的代稱。即我們給大模型的輸入稱為 Prompt,而大模型返回的輸出一般稱為 Completion。 Prompt 需要清晰明確地表達需求,提供充足上下文,使語言模型能夠準確理解我們的意圖。更長、…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: 如何獲取目錄大小?

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

Unity入門學習(四)3D數學(4)之四元數Quaternion

目錄 一、什么是四元數 二、和歐拉角的關聯以及為什么會出現四元數 三、四元數的基本組成 Unity中的表示: 四、四元數Quaternion這個類中具有的屬性和方法 常用屬性 核心方法 五、四元數之間的計算 1. 叉乘(組合旋轉) 2. 點積&#…