截止上星期(本文写于2023.02.07),JetBrains推出Compose跨渠道现已发布了1.3.0版本,能够说是很安稳了。很明显这也是跨渠道UI的一个很好的方案。
假如你还不了解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” 项目,从这找点儿创意,制作一个计数器运用程序,允许用户递加和递减一个数值,并记载最新注册的操作是什么。
想要完结上图这个app,咱们得决议好运用什么样的架构
选取架构
咱们将运用 干净架构(MVVM),这是构建 GUI 运用程序(尤其是在 Android 上)的常用解决方案。 写Android的肯定是对这个架构老生常谈啦。假如你不太了解这个架构,并且感兴趣,也能够先关掉页面去研究一下~比方这个链接-Android干净架构教程
好了,到这就能够开端开工了!咱们会用如下几个砖块,构建堆砌咱们的app:
Domain:便是Model层,正常应该包括app的悉数model,可是这个比较简略,只需求一个data class
数据类。
Data:咱们的抽象数据源,便是保存这个计数器app的数据的。
Use Cases:一切的用例类,便是:递加计数器、递减计数器并获取其值的办法。
Presentation:界面对应的viewModel,整理页面操作逻辑。
Framework:数据源完结以及每个渠道的用户界面。
留意:上述一切『砖块』,除了只有Framework里面的UI部分,都是能够跨渠道复用的。
开端写代码吧
好了,现在能够开端写代码了,咱们用Intellij Idea作为示例IDE,假如你用其他惯用IDE也能够找到相似的操作方法。
先创立一个工程,从上面罗列出来的架构开端完结。一个一个类的渐渐写,直到写完悉数的渠道内容。 Idea这个IDE供给了一些预先构建好的KMP模型运用,咱们能够直接运用。不过为了更好的学会内容,咱们就先从头开端写吧。
翻开IDEA,点击 File > New Project(我的是英文环境,中文相似)。
填上你自己的项目姓名就能够运转了。
模块
创立好项目后,第一件事儿,就得创立一下不同的module: common
、android
、desktop
、web
。咱们就从最基本的common
开端写,写好了其他module也能够依赖它。
这时分直接在根目录右键,new module,挑选compose MultiPlatform。直接就能够创立相关的模块
创立成功的作用如下:
修改根目录的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")