截止上星期(本文写于2023.02.07),JetBrains推出Compose跨渠道现已发布了1.3.0版本,能够说是很安稳了。很明显这也是跨渠道UI的一个很好的方案。

KMP—仅需一套代码,使用kotlin也能一站式搭建android, 桌面端,和web端app!

假如你还不了解Compose Multiplatform是什么, 也能够直接参考官网的JetBrains 网站的『长懒看』说明,一句话便是:

Fast reactive Desktop and Web UI framework for Kotlin,JetBrain公司基于Google的先进东西套件compose,为开发者打造了一套快速呼应的桌面端的web端 UI结构,能够完全运用kotlin开发。

由于和jetpack Compose绑定到一起了,信任大部分android 开发者一会儿就理解:咱们现在能够直接仅用kotlin就打造全渠道跨渠道的app了。

老哥,为啥不用flutter呢?有差异么?

其实二者仍是有相当大的不同的。Kotlin跨渠道技能(后文称KMP)和flutter相比,最主要的优势便是不用再学一个新的言语Dart了,直接用koltin就能够搞定,降低了学习本钱。除此之外,我还发现了一个有趣的不同之处——他们处理跨渠道架构的方案完全不同。

运用Flutter的时分,你需求先写好根底的 事务逻辑、UI逻辑,都只写一次,之后这些根底逻辑就能在不同的渠道上直接运转了。你也能够继续写一些对不同渠道的适配代码,来优化在特定渠道运转的兼容性作用。但,无论你怎样写,真正运转到移动设备、桌面app或者是网页端的时分,你的程序仍是由Flutter引擎(由Skia图像处理库构建的引擎)烘托出来而不是直接在操作体系层级烘托的。这就导致它的可移植性很好,可是UI作用并不好,和原生作用仍是有些距离。

然而,运用KMP的话,你的事务逻辑仍是只写一次,可是后面的UI界面,你需求运用kotlin对方针渠道别离编写。虽然大多都能够运用kt言语,可是写法仍是有差异的。比方,写android就需求用jetpack Compose结构,iOS就用swift写,桌面端就用compose Multiplatform写,等等。因而,你的app最终会有一个更挨近原生的UI作用 —— 只是可移植性就差一些。

最重要的是,这两者供给了不同的办法,怎样用仍是得看你的事务场景。

说实话,全体来说仍是KMP听起来更好,信我!

理论到此为止!说了这么久,让你有一个开端的感受。但让咱们暂时把理论放在一边,关注『怎样用』

新建一个Demo APP

仍是得实操一下,要决议开发点什么东西,才能展示一切要了解的实战内容。 Flutter 也有“Hello World” 项目,从这找点儿创意,制作一个计数器运用程序,允许用户递加和递减一个数值,并记载最新注册的操作是什么。

KMP—仅需一套代码,使用kotlin也能一站式搭建android, 桌面端,和web端app!

想要完结上图这个app,咱们得决议好运用什么样的架构

选取架构

咱们将运用 干净架构(MVVM),这是构建 GUI 运用程序(尤其是在 Android 上)的常用解决方案。 写Android的肯定是对这个架构老生常谈啦。假如你不太了解这个架构,并且感兴趣,也能够先关掉页面去研究一下~比方这个链接-Android干净架构教程

好了,到这就能够开端开工了!咱们会用如下几个砖块,构建堆砌咱们的app:

Domain:便是Model层,正常应该包括app的悉数model,可是这个比较简略,只需求一个data class数据类。 Data:咱们的抽象数据源,便是保存这个计数器app的数据的。 Use Cases:一切的用例类,便是:递加计数器、递减计数器并获取其值的办法。 Presentation:界面对应的viewModel,整理页面操作逻辑。 Framework:数据源完结以及每个渠道的用户界面。

留意:上述一切『砖块』,除了只有Framework里面的UI部分,都是能够跨渠道复用的。

KMP—仅需一套代码,使用kotlin也能一站式搭建android, 桌面端,和web端app!

开端写代码吧

好了,现在能够开端写代码了,咱们用Intellij Idea作为示例IDE,假如你用其他惯用IDE也能够找到相似的操作方法。

先创立一个工程,从上面罗列出来的架构开端完结。一个一个类的渐渐写,直到写完悉数的渠道内容。 Idea这个IDE供给了一些预先构建好的KMP模型运用,咱们能够直接运用。不过为了更好的学会内容,咱们就先从头开端写吧。

翻开IDEA,点击 File > New Project(我的是英文环境,中文相似)。

KMP—仅需一套代码,使用kotlin也能一站式搭建android, 桌面端,和web端app!

填上你自己的项目姓名就能够运转了。

模块

创立好项目后,第一件事儿,就得创立一下不同的module: commonandroiddesktopweb。咱们就从最基本的common开端写,写好了其他module也能够依赖它。

这时分直接在根目录右键,new module,挑选compose MultiPlatform。直接就能够创立相关的模块

KMP—仅需一套代码,使用kotlin也能一站式搭建android, 桌面端,和web端app!

创立成功的作用如下:

KMP—仅需一套代码,使用kotlin也能一站式搭建android, 桌面端,和web端app!

修改根目录的gradle.properties文件如下:

kotlin.code.style=official
android.useAndroidX=true
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
android.enableJetifier=true

这个时分编译应该会很漫长,能够先等候,稍后咱们会开端创立数据源集合。

数据集

由于compose的模板现已创立好了相关文件夹,可是需求思考一个问题:

不是说common模块应该是跨渠道的嘛?为什么还要在里面创立desktop和android?

能够假定一个虚拟的运用场景:你正在开发一个跨渠道的app,可是你也需求获取到一些,不同渠道特有的API。比方:获取体系版本,衔接到底层的日志体系,或者是生成随机的uuid等功能。

KMP仍是允许一些简略的方法去获取上面这些底层架构功能的嗯。你能够像如下操作:

// Under Common
expect fun randomUUID(): String// Under Android
import java.util.*
actual fun randomUUID() = UUID.randomUUID().toString()// And so on for all other platforms

当然了,这些复杂的底层操作在咱们的简略demo中并不会用到~

回到咱们的项目中。

能够留意一下咱们的compose跨渠道module中的 settings.gradle.kts 的文件内容

pluginManagement {
    repositories {
        google()
        gradlePluginPortal()
        mavenCentral()
        maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
    }
    plugins {
        kotlin("multiplatform").version(extra["kotlin.version"] as String)
        kotlin("android").version(extra["kotlin.version"] as String)
        id("com.android.application").version(extra["agp.version"] as String)
        id("com.android.library").version(extra["agp.version"] as String)
        id("org.jetbrains.compose").version(extra["compose.version"] as String)
    }
}
rootProject.name = "composemultidemo"
include(":android", ":desktop", ":common")