天天看點

用Kotlin進行跨平台開發,看這一篇就夠了

作者:Freemen聊技術

/ 前言 /

過完情人節後,大家是否為未來開始奮鬥了呢?今天小編更新兩個安卓開發崗位,話說現在Kotlin這麼火了嗎?安卓開發都在使用Kotlin開發。

用Kotlin進行跨平台開發,看這一篇就夠了

近些年,不管是最初的RN還是到現在的Flutter、Compose,他們都在做着一件事——跨平台。

他們的成就主要都是在UI上跨平台,當然Flutter雖然可以處理一些公共的業務邏輯,但目前在業務較重的情況下仍然需要各自處理。

而KMM卻與之相反,接下來讓我們來一起了解一下吧~

/ 什麼是KMM /

KMM 即 Kotlin Multiplatform Mobile是一個SDK,旨在簡化跨平台移動應用程式的開發。通過KMM開發者可以在iOS和Android應用程式之間共享通用代碼,并僅在必要時編寫特定于平台的代碼。

上面官方的描述說了這麼多,簡單的來說就是KMM注重業務邏輯跨平台,和Flutter、Compose完全相反。即使如此,在這個都想着跨别人的年代,KMM也稱自己并沒有說過不會做UI的跨平台...

用Kotlin進行跨平台開發,看這一篇就夠了

/ KMM的HelloWorld /

環境配置

這裡假設,你已經有了一台Mac、安裝了高版本的AndroidStudio(這裡不會介紹Xcode的配置),在AndroidStudio中搜尋插件Kotlin Multiplatform Mobile并安裝,如下圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

由于KMM還不是特别的成熟,是以建議開發者将Kotlin插件也更新到最新版本,避免出現一些相容性問題。

建立項目

安裝好插件并重新開機後,我們可以建立一個Kotlin Multiplatform App,如下圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

輸入項目名稱,選擇對應的配置。

用Kotlin進行跨平台開發,看這一篇就夠了

在iOS架構分發清單中,選擇正常架構選項 (這裡為了簡單示範,實際項目根據所需選擇即可)。點選Finish就建立了一個KMM的項目。

項目結構

建立完的KMM項目結構如下圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

androidApp、iOSApp就是對應的Android、iOS代碼庫,這裡主要說一下shared共享子產品,即存放Android、iOS公共業務邏輯的部分。

共享子產品由三個源集組成:androidMain、commonMain和iosMain。源集是一個Gradle概念,用于邏輯上組合在一起的多個檔案,其中每個組都有自己的依賴項。在Kotlin Multiplatform中,共享子產品中的不同源集可以針對不同的平台。如下圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

支援多個目标的多平台庫,可以在公共源集commonMain中使用。例如Koin、Apollo和Okio。

android和iOSMain,這些是來自相關生态系統的正常庫。可以使用CocoaPods或其他依賴項管理器的原生iOS項目和使用Gradle的Android項目中使用。

運作程式

安裝過KMM的插件,可以在AndroidStudio中選擇iOS的虛拟機,前提必須是已經在Xcode或其他地方配置了iOS的虛拟機,如圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

我們這裡僅運作Android程式,運作結果如下圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

這個結果來自shared子產品中commonMain下的Greeting檔案,代碼如下所示。

class Greeting {
    private val platform: Platform = getPlatform()

    fun greeting(): String {
        return "Hello, ${platform.name}!"
    }
}

           

在iOS的手機上運作則會顯示iOS版本号,這裡交給讀者自己去嘗試了。因為我的電腦組態不允許我安裝Xcode...

用Kotlin進行跨平台開發,看這一篇就夠了

/ 實作元旦倒計時 /

接着我們看如何實作元旦倒計時的功能,其實就是計算現在距離元旦還有多少天。是不是有點似曾相識~

用Kotlin進行跨平台開發,看這一篇就夠了

這一部分是公共邏輯,在shared目錄中的build.gradle.kts檔案中添加配置如下:

val commonMain by getting{
    dependencies {
        implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
    }
}           

在shared/src/commonMain/kotlin目錄下,建立新的Kotlin檔案,代碼如下所示:

import kotlinx.datetime.*

fun daysUntilNewYear(): Int {
    val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
    val closestNewYear = LocalDate(today.year + 1, 1, 1)
    return today.daysUntil(closestNewYear)
}           

修改Greeting的greet方法如下所示。

fun greeting(): String {
   return "距離元旦還有${daysUntilNewYear()}天"
}           

運作程式,結果如下圖所示。

用Kotlin進行跨平台開發,看這一篇就夠了

在iOS手機中運作的效果也是一緻的。

好吧,這個例子太簡單了,稍微來個實用點的例子~

/ 實作網絡請求功能 /

添加依賴

不管什麼業務肯定要用到網絡請求的功能,我們來看這部分的公共邏輯該怎麼處理。

首先我們将用到依賴添加進來,這裡主要有Kotlin協程、序列化(Ktor使用要求)、和Ktor,Ktor是一個可以用于HTTP請求的網絡架構,如果讀者不熟悉的話可自行檢視。代碼如下所示。

val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")

                implementation("io.ktor:ktor-client-core:$ktorVersion")
                implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
                implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
            }
        }           

同時我們需要再androidMain和iOSMain目錄下添加對應Ktor庫,代碼如下所示

val androidMain by getting {
        dependencies {
            implementation("io.ktor:ktor-client-android:$ktorVersion")
        }
    }
    val iosMain by creating {
        dependencies {
            implementation("io.ktor:ktor-client-darwin:$ktorVersion")
        }
    }           

這裡ktorVersion的版本是2.1.2。

添加接口

這裡我們仍然使用「wandroid」中的每日一問接口:

https://wanandroid.com/wenda/list/1/jso

與在Compose中使用Paging分頁庫使用的接口和實體類是一樣的,這裡就不重複展示了。

建立接口位址類,代碼如下所示。

object Api {
    val dataApi = "https://wanandroid.com/wenda/list/1/json"
}           

建立HttpUtil類,用于建立HttpClient對象和擷取資料的方法,代碼如下所示

class HttpUtil {
    private val httpClient = HttpClient {
        install(ContentNegotiation) {
            json(Json {
                prettyPrint = true
                isLenient = true
                ignoreUnknownKeys = true
            })
        }
    }

    /**
     * 擷取資料
     */
    suspend fun getData(): String {
        val rockets: DemoReqData =
            httpClient.get(Api.dataApi).body()
        return "${rockets.data} "
    }
}
           

這裡的代碼我們應該都是比較熟悉的,僅僅是換了一個網絡請求架構而已。現在公共的業務邏輯已經處理好了,隻需要頁面端調用方法然後解析資料并展示即可。這裡我們仍然以Android實作為例。

用Kotlin進行跨平台開發,看這一篇就夠了

實作頁面層

在androidApp下編寫Compose代碼,代碼比較簡單,就是點選按鈕請求資料,展示展示在文本中,代碼如下所示。

setContent {
            MyApplicationTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background
                ) {
                    Column() {
                        val scope = rememberCoroutineScope()
                        var text by remember { mutableStateOf("正在加載") }
                        Button(onClick = {
                            scope.launch {
                                text = try {
                                    Gson().toJson(HttpUtil().getData())
                                } catch (e: Exception) {
                                    e.localizedMessage ?: "error"
                                }
                            }
                        }) {
                            Text(text = "請求資料")
                        }
                        Greeting(text)
                    }
                }
            }
        }           

這裡我們并沒有解析資料,僅僅是将請求的資料轉化為Json串顯示在文本中。運作程式,預設顯示正在加載,點選按鈕顯示請求接口的資料。

用Kotlin進行跨平台開發,看這一篇就夠了

這樣我們就實作了網絡請求的功能。

/ 寫在最後 /

到這裡,恭喜你,已經入門了KMM的使用,更多的使用方法需要在實際項目中不斷地去總結,去嘗試,Jetpack目前也在開發KMM版本,這對KMM發展将會是一個推進~

用Kotlin進行跨平台開發,看這一篇就夠了

本文轉載自公衆号郭霖

作者:黃林晴

今日推薦:

安卓開發工程師

要求

1. 全日制統招大學畢業,1年左右安卓開發經驗,可接受優秀23屆應屆生

2. 精通Android進階特性和SDK的使用,熟練掌握品牌手機和Android版本之間的差別;

7.需熟悉Kotlin開發

4. 熟練掌握Android各種調優工具,可以精确定位bug,熟練掌握IO,記憶體和CPU的優化;

5. 掌握Android端電量和流量優化技巧;

6. 掌握安卓中繪圖機制;

7.有JNI程式設計優先的考慮。

薪資:15k-30k

工作地點:杭州

投遞方式:Freemen App中定位杭州搜尋安卓開發工程師

安卓開發實習生

要求

1、2023屆大學及以上學曆,計算機相關專業;

2、計算機基礎紮實,熟悉資料結構、作業系統、計算機網絡;

3、熟悉java或c/c++/objective-c;

4、對技術有熱情,能夠在指導後獨立進行開發工作,對代碼規範有要求;

薪資:4k-6k

工作地點:杭州

投遞方式:Freemen App中定位杭州搜尋安卓開發實習生

進階安卓開發工程師

1.計算機科學、軟體工程或相關專業大學或以上學曆。至少5年Android原生開發工作經驗。

2.精通Java和Kotlin語言。

3.良好的自動化測試經驗,包括單元測試和UI測試。

4.具有在Android和通用軟體開發中使用常見設計模式的工作知識,如Reactive Patterns,MVVM。

5.高标準的代碼品質、可維護性和性能。

6.有建立、維護和釋出商業移動應用程式的經驗。

7.有建立、維護和運輸車輛配套應用程式經驗者優先。

薪資範圍:25k-28k

工作地點:上海

投遞方式:如需投遞可私信小編

以上就是今日最新推薦,時間不等人,最近找工作的不要錯過,身邊需要找工作的小夥伴也可以互相推薦~