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)
}