一、前言

最近才有空,想起来Compose-jb和kmm这2个框架,就来个快速入门指南吧。

什么是KMM (Kotlin Multiplatform Mobile)

KMM用于简化跨平台开发,可以在Android和IOS之间共享通用的代码。
仅在使用各自平台能力的时候,才会去编写各自平台特定的代码。

Compose Multiplatform, by JetBrains 缩写名称:compose-jb

Compose Multiplatform, by JetBrains

JetBrains开源的compose-jb官方的介绍内容:

桌面和Web UI框架,基于Google的JetpackCompose工具包
Compose Multiplatform 简化并加速了桌面和Web应用程序的UI开发,并且允许Android和桌面之间大部分的UI代码共享。

二、Window平台-开发工具

1、compose-jb环境安装

1、下载IntelliJ IDEA Community Edition

2、下载JAVA JDK

2、KMM环境安装

1、下载AndroidStudio

2、下载JAVA JDK

3、下载Kotlin多平台移动插件

在Android Studio中,在市场中搜索:Kotlin Multiplatform Mobile,然后安装

4、更新Kotlin插件

Kotlin插件与AndroidStudio版本是捆绑在一起的,我们需要更新Kotlin到最新版本,来避免兼容性问题。

三、MacOS平台-开发工具

1、compose-jb环境安装

1、下载IntelliJ IDEA Community Edition

2、下载JAVA JDK

2、KMM环境安装

1、下载XCode

2、在终端或命令行工具中,运行以下命令

brew install kdoctor

如果你还没有Homebrew,请安装它或查看KDoctor README以获取其他安装方法。

3、安装完成后,在控制台调用 KDoctor

kdoctor

四、KMM工程

1、创建工程

打开AndroidStudio ,点击 New Project,然后找到 Kotlin Multiplatform App,然后点击 Next

配置应用程序的名称、应用包名、项目的位置、最小SDK版本,配置完成之后,点击 Next

iOS framework distribution 我们选择Regular framework, 因为此选项不需要第三方工具,并且安装问题较少。

cocoapods dependency manager 是什么呢?

CocoaPods是 Swift 和 Objective-C Cocoa项目的依赖管理器。

对于更复杂的项目,可能需要CocoaPods依赖项管理器来帮助处理库依赖项。

点击Finish,首次执行此操作时,下载和设置所需的组件可能需要一些时间。

2、工介绍

KMM工程包含三个模块:

  • androidApp 是Android应用程序项目,依赖于shared模块,并将shared模块用作常规的Android库,UI就是使用Jetpack Compose那一套

  • shared 包含Android和iOS应用程序在平台之间共享的通用代码逻辑

  • iosApp 是iOS应用程序项目,它依赖于并使用shared模块作为iOS框架


androidApp和iosApp模块都是各自平台原来的开发方式,shared模块它是平台之间共享的通用代码逻辑,那么它如何实现共享的呢?我们看一下下面这张图片:

连接到各自的平台:

expect和actual文档

我们可以看到它在公共模块中使用expect关键字,expect修饰类、成员变量或方法时,表示类、成员变量、方法,可以跨平台实现。

注意:expect声明不包含任何实现代码。
expect和actual所修饰的类/变量/方法,名称都需要完全一样,并且位于同一包中(具有相同的完整包名)。

在各自的平台Android/IOS,中使用actual修饰,实现同名的类、方法、成员变量。

我们再来看Hello World示例,commonMain目录下面创建了一个Platform接口,并使用expect关键字修饰了getPlatform()方法

那么Android/IOS平台,需要去使用actual修饰,实现同名的类、方法、成员变量。

我们在commonMain目录下面,可以定义逻辑类,共享通用的代码逻辑,同样以Hello World为例:

那么在Android/IOS的工程中就可以使用这个Greeting类来获取通用的代码逻辑,如下:


3、如何添加依赖项

切换到Project视图下,找到shared模块,点击build.gradle.kts,在sourceSets里面,我们可以给
commonMain、androidMain、iosMain 分别添加依赖。

我们这里给commonMain添加依赖项,这样Android、IOS平台就可以在获取通用代码逻辑的时候,使用到这个依赖项的能力了。

添加kotlinx-datetime的依赖项:

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

commonMain目录下面创建一个KotlinNewYear.kt的File:

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里面使用这个方法:

我们看看运行之后的结果:

4、网络请求

我们需要准备以下三个多平台库

  • kotlinx.coroutines,用于使用协程编写异步代码,允许同时操作
  • kotlinx.serialization,用于将 JSON 响应反序列化为用于处理网络操作的实体类的对象。
  • Ktor,一个作为HTTP客户端的框架,用于通过互联网检索数据。

1、添加Kotlinx.coroutines依赖库:

在shared模块的build.gradle.kts中,添加kotlinx.coroutines依赖

sourceSets {val commonMain by getting {dependencies {// ...implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")}}
}

我们打开项目根目录下面的build.gradle.kts文件,查看kotlin版本是否小于1.7.20

使用 Kotlin 1.7.20 及更高版本,则默认情况下已经启用了新的 Kotlin/Native 内存管理器。

Kotlin版本小于1.7.20版本,请将以下内容添加到build.gradle.kts文件末尾:

kotlin.targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget::class.java) {binaries.all {binaryOptions["memoryModel"] = "experimental"}
}

2、添加Kotlinx.serialization依赖库:

我们打开shared模块,打开build.gradle.kts文件,在文件开头的plugins块中增加 序列化插件 内容:

plugins {kotlin("plugin.serialization") version "1.8.0"
}

3、添加Ktor依赖库

我们打开shared模块,打开build.gradle.kts文件,增加下面内容:

val ktorVersion = "2.2.1"sourceSets {val commonMain by getting {dependencies {// ...implementation("io.ktor:ktor-client-core:$ktorVersion")implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")}}val androidMain by getting {dependencies {implementation("io.ktor:ktor-client-android:$ktorVersion")}}val iosMain by creating {// ...dependencies {implementation("io.ktor:ktor-client-darwin:$ktorVersion")}}
}

ktor-client-core:核心依赖项。

ktor-client-content-negotiation:负责序列化/反序列化特定格式的内容。

ktor-serialization-kotlinx-json:使用JSON格式用作序列化库,在接收响应时将其反序列化为数据类。

ktor-client-android:提供Android平台引擎

ktor-client-darwin:提供IOS平台引擎

点击Sync Now同步Gradle之后,我们创建一个RocketLaunch.kt

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable@Serializable
data class RocketLaunch (@SerialName("flight_number")val flightNumber: Int,@SerialName("name")val missionName: String,@SerialName("date_utc")val launchDateUTC: String,@SerialName("success")val launchSuccess: Boolean?,
)

点击查看Ktor官方文档

4、创建一个Ktor实例来执行网络请求并解析生成的JSON

import io.ktor.client.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.json.Jsonclass Greeting {private val platform: Platform = getPlatform()private val httpClient = HttpClient {// 安装ContentNegotiation插件install(ContentNegotiation) {// 注册 JSON 序列化程序json(Json {// true:表示打印并生成漂亮的JSON。 默认情况下:falseprettyPrint = true// true:删除 JSON 规范限制,允许使用带引号的布尔文本和不带引号的字符串文字isLenient = true// true:表示可以忽略JSON中遇到的未知属性,防止引发序列化异常。 默认情况下:falseignoreUnknownKeys = true})}}
}

点击查看ContentNegotiation Ktor插件文档

修改greeting方法,添加suspend修饰,并使用httpClient去获取网络请求的数据:

import io.ktor.client.call.*
import io.ktor.client.request.*class Greeting {// ...@Throws(Exception::class)suspend fun greeting(): String {// 获取数据val rockets: List<RocketLaunch> =httpClient.get("https://api.spacexdata.com/v4/launches").body()// 判断最近一次火箭是否发射成功val lastSuccessLaunch = rockets.last { it.launchSuccess == true }// 返回结果return "Guess what it is! > ${platform.name.reversed()}!" +"\nThere are only ${daysUntilNewYear()} left until New Year! 												

快速入门KMM和Compose Multiplatform相关推荐

  1. Compose也能跨平台?Compose Multiplatform是啥?KMM又是什么?

    现在的跨平台框架真是跟打了鸡血似的,跟生产队的驴一样玩命的更新啊,一会儿功夫就遍地开花,开发者尤其是Androiders们还能学得过来吗? Compose Multiplatform Compose ...

  2. 10个问题带你看懂 Compose Multiplatform 1.0

    近日 JetBrains 正式发布了 Compose Multiplatform 1.0 版,这标志其在生产环境中使用的时机已经成熟.相信有不少人对它还不太熟悉,本文通过下面 10 个热门问题带大家认 ...

  3. 又一款跨平台开发框架 :Compose Multiplatform 1.0 发布!

    点击"开发者技术前线",选择"星标" 让一部分开发者看到未来 作者 | 罗燕珊   来自 infoQ JetBrains 工程师 Sebastian Aigne ...

  4. 60分钟快速入门PyTorch

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 136 篇文章,本文大约 26000 字,阅读大约需要 60 分钟 P ...

  5. 60分钟快速入门 PyTorch

    PyTorch 是由 Facebook 开发,基于 Torch 开发,从并不常用的 Lua 语言转为 Python 语言开发的深度学习框架,Torch 是 TensorFlow 开源前非常出名的一个深 ...

  6. 快速入门PyTorch(3)--训练一个图片分类器和多 GPUs 训练

    2019 第 44 篇,总第 68 篇文章 本文大约14000字,建议收藏阅读 快速入门 PyTorch 教程前两篇文章: 快速入门Pytorch(1)--安装.张量以及梯度 快速入门PyTorch( ...

  7. MinIO部署快速入门

    MinIO部署快速入门 MinIO是一个云原生的应用程序,旨在在多租户环境中以可持续的方式进行扩展.编排(orchestration)平台为MinIO的扩展提供了非常好的支撑.以下是各种编排平台的Mi ...

  8. MinIO Docker 快速入门 ​​​​​​​

    MinIO Docker 快速入门 前提条件 您的机器已经安装docker. 从 这里下载相关软件. 在Docker中运行MinIO单点模式. MinIO 需要一个持久卷来存储配置和应用数据.不过, ...

  9. MinIO Docker 快速入门

    MinIO Docker 快速入门 前提条件 您的机器已经安装docker. 从 这里下载相关软件. 在Docker中运行MinIO单点模式. MinIO 需要一个持久卷来存储配置和应用数据.不过, ...

最新文章

  1. 【组队学习】【35期】动手学数据分析
  2. Bellman-Ford 算法
  3. winform 界面库SunnyUI初次使用
  4. 计算机网络·用户代理和浏览器 发送邮件分别需要的协议
  5. 【收藏】一篇快速帮企业转型区块链的锦囊
  6. 函数计算镜像加速:从分钟到秒的跨越
  7. java socket编写服务器_Java网络学习笔记1:用(Server)Socket编写简单的客户/服务器程序...
  8. 计算机网络(八)-数据链路层-帧封装
  9. php判断绝对路径文件是否存在,php – 如何确定文件路径是否绝对?
  10. 常用类 (三) ----- BigDecimal和BigInteger大数类
  11. 从全职高手开始的系统_全职高手8年登上巅峰荣耀,阅文做对了什么?
  12. win10下安装Cygwin配置gcc编译环境
  13. git pull VS git fetchmerge(good)
  14. 一套完整的综合布线系统方案
  15. html页面右下角添加js广告,javascript实现右下角广告框效果
  16. 置换和轮换(新姿势,摘自黑书)
  17. vba手机号码归属_国庆献礼-EXCEL自定义函数获取手机号码归属地及运营商信息 | Excel实例教学网 微信公众号EXCEL880...
  18. 浅谈如何做外链的技巧和如何获得外链
  19. https协议谷歌浏览器使用Jmeter脚本录制
  20. 设置session的有效时间

热门文章

  1. Linux网卡驱动一硬件原理篇
  2. ubuntu18只进入安全模式_安全模式命令行进入 - 卡饭网
  3. 服务器网站iis如何关闭,08系统如何关闭IIS服务(图文)
  4. 剑指Offer算法笔记(Java)剪绳子
  5. R语言使用epiDisplay包的alpha函数计算dataframe数据中指定数据列之间的信度分析、克朗巴哈系数、、每剔除某一条目后系数的变化、alphaBest函数获取最高alpha值对应的项目集
  6. 基于VS2019 C++的跨平台(Linux)开发(1.5)——管道
  7. Java技术栈学习之SpringCloud服务的注册与发现(Eureka)
  8. Mac实用工具之OCR识别【Bob】
  9. 07.阿里云RDS数据库的基本操作
  10. 微信小程序:Array数组的操作