前言

近些年,不管是开始的RN仍是到现在的Flutter、Compose,他们都在做着一件事——跨渠道。

他们的成果主要都是在UI上跨渠道,当然Flutter虽然能够处理一些公共的事务逻辑,但目前在事务较重的情况下仍然需求各自处理。

而KMM却与之相反,接下来让咱们来一同了解一下吧~

什么是KMM

KMM 即 Kotlin Multiplatform Mobile 是一个 SDK,旨在简化跨渠道移动应用程序的开发。通过KMM开发者能够在 iOS 和 Android 应用程序之间同享通用代码,并仅在必要时编写特定于渠道的代码。

上面官方的描述说了这么多,简略的来说便是KMM注重事务逻辑跨渠道,和Flutter、Compose彻底相反。即使如此,在这个都想着跨他人的时代,KMM也称自己并没有说过不会做UI的跨渠道…

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~​修正

KMM的HelloWorld

环境装备

这儿假定,你现已有了一台Mac、装置了高版本的AndroidStudio(这儿不会介绍Xcode的装备),

在AndroidStudio中搜索插件

Kotlin Multiplatform Mobile并装置,如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

因为KMM还不是特别的老练,所以建议开发者将Kotlin插件也升级到最新版本,避免出现一些兼容性问题。

创立项目

装置好插件并重启后,咱们能够创立一个Kotlin Multiplatform App,如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

输入项目名称,挑选对应的装备

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

在 iOS 结构分发列表中,挑选惯例结构选项 (这儿为了简略演示,实际项目依据所需挑选即可)。点击Finish就创立了一个KMM的项目。

项目结构

创立完的KMM项目结构如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

androidApp、iOSApp便是对应的Android、iOS代码库,这儿主要说一下shared同享模块,即寄存Android、iOS公共事务逻辑的部分。

同享模块由三个源集组成:androidMain、commonMain 和 iosMain。 源集是一个 Gradle 概念,用于逻辑上组合在一同的多个文件,其中每个组都有自己的依赖项。 在 Kotlin Multiplatform 中,同享模块中的不同源集能够针对不同的渠道。 如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

支撑多个方针的多渠道库,能够在公共源集 commonMain 中运用。例如 Koin、Apollo 和 Okio。

android和iOSMain, 这些是来自相关生态系统的惯例库。 能够运用 CocoaPods 或其他依赖项管理器的原生 iOS 项目和运用 Gradle 的 Android 项目中运用。

运转程序

装置过KMM的插件,能够在AndroidStudio中挑选iOS的虚拟机,条件必须是现已在Xcode或其他地方装备了iOS的虚拟机,如图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

咱们这儿仅运转Android程序,运转成果如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

这个成果来自shared模块中commonMain下的Greeting文件,代码如下所示。

class Greeting {
    private val platform: Platform = getPlatform()
    fun greeting(): String {
        return "Hello, ${platform.name}!"
    }
}

KMM跨平台开发入门,看这一篇就够了~

在iOS的手机上运转则会显现iOS版本号,这儿交给读者自己去测验了。因为我的电脑装备不允许我装置Xcode…

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

完成元旦倒计时

接着咱们看如何完成元旦倒计时的功用,其实便是核算现在间隔元旦还有多少天。是不是有点似曾相识~

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

这一部分是公共逻辑,在shared目录中的build.gradle.kts文件中增加装备如下

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

KMM跨平台开发入门,看这一篇就够了~

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

KMM跨平台开发入门,看这一篇就够了~

修正Greeting的greet办法如下所示

fun greeting(): String {
   return "间隔元旦还有${daysUntilNewYear()}天"
}

KMM跨平台开发入门,看这一篇就够了~

运转程序,成果如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

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

KMM跨平台开发入门,看这一篇就够了~

一起咱们需求再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")
        }
    }

KMM跨平台开发入门,看这一篇就够了~

这儿ktorVersion的版本是2.1.2。

增加接口

这儿咱们仍然运用「wandroid」中的每日一问接口 :wanandroid.com/wenda/list/…

与在Compose中运用Paging分页库运用的接口和实体类是相同的,这儿就不重复展现了。

创立接口地址类,代码如下所示。

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

KMM跨平台开发入门,看这一篇就够了~

创立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} "
    }
}

KMM跨平台开发入门,看这一篇就够了~

这儿的代码咱们应该都是比较熟悉的,仅仅是换了一个网络恳求结构罢了。现在公共的事务逻辑现已处理好了,只需求页面端调用办法然后解析数据并展现即可。这儿咱们仍然以Android完成为例。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

完成页面层

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

KMM跨平台开发入门,看这一篇就够了~

这儿咱们并没有解析数据,仅仅是将恳求的数据转化为Json串显现在文本中。运转程序,默许显现正在加载,点击按钮显现恳求接口的数据。如下图所示。

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~

这样咱们就完成了网络恳求的功用。

写在最终

到这儿,恭喜你,现已入门了KMM的运用,更多的运用办法需求在实际项目中不断地去总结,去测验,Jetpack目前也在开发KM版本,这对KMM发展将会是一个推动~

KMM跨平台开发入门,看这一篇就够了~
KMM跨平台开发入门,看这一篇就够了~