启用多平台支持
-
修改项目的
build.gradle.kts
:首先,需要在
build.gradle.kts
文件中添加多平台插件并启用实验性功能。kotlinplugins { kotlin("multiplatform") version "1.8.0" // 请使用当前最新版本 } kotlin { // 设置多平台支持 jvm() // 添加 JVM 平台支持 ios() // 添加 iOS 平台支持 android() // 添加 Android 平台支持 // 启用多平台项目的实验性功能 experimental { // 启用多平台项目支持 multiPlatformProjects() } }
-
创建共享代码模块 :
public actual typealias
是 Kotlin 语言中的一个关键字组合,通常出现在 Kotlin Multiplatform 项目中。它用于在不同的平台(如 JVM、JavaScript、Native)上定义公共类型别名。这些类型别名允许跨平台共享代码,同时在每个平台上有特定的实现。
-
public
: 这是一个可见性修饰符,表示该类型别名可以在任何地方访问。 -
actual
: 这个关键字用于声明平台特定的实际实现。它与expect
关键字配对使用,后者用于声明平台无关的预期声明。 -
typealias
: 这是 Kotlin 中用于创建类型别名的关键字。在项目中创建一个共享代码模块,例如
shared
。这个模块会包含使用expect
关键字定义的共享代码。kotlin// 在 shared/src/commonMain/kotlin 目录下创建代码文件 // shared/src/commonMain/kotlin/Greeting.kt package com.example.shared // 共享代码块:共享代码可以在不同的平台上复用 expect fun platformName(): String fun greeting(): String { return "Hello, ${platformName()}!" }
-
提供平台特定实现 :
在相应的平台模块中提供
platformName
函数的具体实现。iOS平台实现:
kotlin// shared/src/iosMain/kotlin/Greeting.kt package com.example.shared actual fun platformName(): String { return "iOS" }
Android平台实现:
kotlin// shared/src/androidMain/kotlin/Greeting.kt package com.example.shared actual fun platformName(): String { return "Android" }
-
运行项目 :
确保你在
main
函数中调用了greeting
函数,然后运行项目。输出会根据平台不同而有所区别。kotlin// shared/src/commonMain/kotlin/Main.kt package com.example.shared fun main() { println(greeting()) // 根据平台输出 "Hello, iOS!" 或 "Hello, Android!" }
项目结构:
.
├── build.gradle.kts
├── shared
│ ├── src
│ │ ├── commonMain
│ │ │ └── kotlin
│ │ │ └── Greeting.kt
│ │ ├── iosMain
│ │ │ └── kotlin
│ │ │ └── Greeting.kt
│ │ └── androidMain
│ │ └── kotlin
│ │ └── Greeting.kt
└── settings.gradle.kts
在Kotlin多平台项目中,commonMain
、iosMain
、androidMain
这些名称是约定俗成的命名方式,用于标识不同平台的源码集。它们是Kotlin官方推荐的默认命名方案,但实际上可以根据需要进行自定义。
1. 默认源码集命名
默认情况下,Kotlin多平台项目使用以下源码集命名:
- commonMain: 存放所有平台共享的代码。
- iosMain: 存放iOS平台特定的代码。
- androidMain: 存放Android平台特定的代码。
这些命名在构建工具中有特定的意义,Kotlin编译器会根据这些名称识别和处理对应平台的代码。
2. 自定义源码集名称
如果需要,可以自定义这些源码集的名称,但需要在项目的build.gradle.kts
文件中明确指定。
自定义示例
假设想将iosMain
重命名为iosSource
,可以按以下步骤进行:
kotlin
kotlin {
jvm() // JVM支持
ios("iosSource") // 自定义iOS源码集名称为 iosSource
android() // Android支持
sourceSets {
val commonMain by getting {
// 配置 commonMain 源码集
}
val iosSource by getting {
// 配置自定义的 iosSource 源码集
}
val androidMain by getting {
// 配置 androidMain 源码集
}
}
}
项目结构也需要相应调整:
.
├── build.gradle.kts
├── shared
│ ├── src
│ │ ├── commonMain
│ │ │ └── kotlin
│ │ │ └── Greeting.kt
│ │ ├── iosSource // 自定义的iOS源码集目录
│ │ │ └── kotlin
│ │ │ └── Greeting.kt
│ │ └── androidMain
│ │ └── kotlin
│ │ └── Greeting.kt
└── settings.gradle.kts