/ 前言 /
過完情人節後,大家是否為未來開始奮鬥了呢?今天小編更新兩個安卓開發崗位,話說現在Kotlin這麼火了嗎?安卓開發都在使用Kotlin開發。
近些年,不管是最初的RN還是到現在的Flutter、Compose,他們都在做着一件事——跨平台。
他們的成就主要都是在UI上跨平台,當然Flutter雖然可以處理一些公共的業務邏輯,但目前在業務較重的情況下仍然需要各自處理。
而KMM卻與之相反,接下來讓我們來一起了解一下吧~
/ 什麼是KMM /
KMM 即 Kotlin Multiplatform Mobile是一個SDK,旨在簡化跨平台移動應用程式的開發。通過KMM開發者可以在iOS和Android應用程式之間共享通用代碼,并僅在必要時編寫特定于平台的代碼。
上面官方的描述說了這麼多,簡單的來說就是KMM注重業務邏輯跨平台,和Flutter、Compose完全相反。即使如此,在這個都想着跨别人的年代,KMM也稱自己并沒有說過不會做UI的跨平台...
/ KMM的HelloWorld /
環境配置
這裡假設,你已經有了一台Mac、安裝了高版本的AndroidStudio(這裡不會介紹Xcode的配置),在AndroidStudio中搜尋插件Kotlin Multiplatform Mobile并安裝,如下圖所示。
由于KMM還不是特别的成熟,是以建議開發者将Kotlin插件也更新到最新版本,避免出現一些相容性問題。
建立項目
安裝好插件并重新開機後,我們可以建立一個Kotlin Multiplatform App,如下圖所示。
輸入項目名稱,選擇對應的配置。
在iOS架構分發清單中,選擇正常架構選項 (這裡為了簡單示範,實際項目根據所需選擇即可)。點選Finish就建立了一個KMM的項目。
項目結構
建立完的KMM項目結構如下圖所示。
androidApp、iOSApp就是對應的Android、iOS代碼庫,這裡主要說一下shared共享子產品,即存放Android、iOS公共業務邏輯的部分。
共享子產品由三個源集組成:androidMain、commonMain和iosMain。源集是一個Gradle概念,用于邏輯上組合在一起的多個檔案,其中每個組都有自己的依賴項。在Kotlin Multiplatform中,共享子產品中的不同源集可以針對不同的平台。如下圖所示。
支援多個目标的多平台庫,可以在公共源集commonMain中使用。例如Koin、Apollo和Okio。
android和iOSMain,這些是來自相關生态系統的正常庫。可以使用CocoaPods或其他依賴項管理器的原生iOS項目和使用Gradle的Android項目中使用。
運作程式
安裝過KMM的插件,可以在AndroidStudio中選擇iOS的虛拟機,前提必須是已經在Xcode或其他地方配置了iOS的虛拟機,如圖所示。
我們這裡僅運作Android程式,運作結果如下圖所示。
這個結果來自shared子產品中commonMain下的Greeting檔案,代碼如下所示。
class Greeting {
private val platform: Platform = getPlatform()
fun greeting(): String {
return "Hello, ${platform.name}!"
}
}
在iOS的手機上運作則會顯示iOS版本号,這裡交給讀者自己去嘗試了。因為我的電腦組態不允許我安裝Xcode...
/ 實作元旦倒計時 /
接着我們看如何實作元旦倒計時的功能,其實就是計算現在距離元旦還有多少天。是不是有點似曾相識~
這一部分是公共邏輯,在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()}天"
}
運作程式,結果如下圖所示。
在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實作為例。
實作頁面層
在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串顯示在文本中。運作程式,預設顯示正在加載,點選按鈕顯示請求接口的資料。
這樣我們就實作了網絡請求的功能。
/ 寫在最後 /
到這裡,恭喜你,已經入門了KMM的使用,更多的使用方法需要在實際項目中不斷地去總結,去嘗試,Jetpack目前也在開發KMM版本,這對KMM發展将會是一個推進~
本文轉載自公衆号郭霖
作者:黃林晴
今日推薦:
安卓開發工程師
要求
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
工作地點:上海
投遞方式:如需投遞可私信小編
以上就是今日最新推薦,時間不等人,最近找工作的不要錯過,身邊需要找工作的小夥伴也可以互相推薦~