跳到主要内容

Kotlin 多平台应用中定义和模块的注解

KSP 设置

请按照官方文档中的 KSP 设置进行操作:KSP with Kotlin Multiplatform

您还可以查看 Hello Koin KMP 项目,其中包含 Koin Annotations 的基本设置。

添加 KSP 插件

plugins {
alias(libs.plugins.ksp)
}

在 common API 中使用 annotations 库:

sourceSets {
commonMain.dependencies {
implementation(libs.koin.core)
api(libs.koin.annotations)
// ...
}
}

并且不要忘记在正确的 sourceSet 上配置 KSP:

dependencies {
add("kspCommonMainMetadata", libs.koin.ksp.compiler)
add("kspAndroid", libs.koin.ksp.compiler)
add("kspIosX64", libs.koin.ksp.compiler)
add("kspIosArm64", libs.koin.ksp.compiler)
add("kspIosSimulatorArm64", libs.koin.ksp.compiler)
}

声明通用模块(Common Modules) & KMP Expect 组件

在您的 commonMain sourceSet 中,您只需要声明一个 Module 来扫描将具有您的 expect 类或函数的原生实现的包。

下面我们有一个 PlatformModule,在 com.jetbrains.kmpapp.platform 包中扫描,其中我们有 PlatformHelper expect 类。Module 类使用 @Module@ComponentScan 注解进行注解。

// in commonMain

@Module
@ComponentScan("com.jetbrains.kmpapp.platform")
class PlatformModule

// package com.jetbrains.kmpapp.platform

@Single
expect class PlatformHelper {
fun getName() : String
}
备注

生成的代码是在每个平台实现中完成的。Module 包扫描将收集正确的平台实现。

注解原生组件

在每个实现 sourceSet 中,您现在可以定义正确的平台实现。这些实现使用 @Single 注解进行注解(也可以是其他的定义注解):

// in androidMain
// package com.jetbrains.kmpapp.platform

@Single
actual class PlatformHelper(
val context: Context
){
actual fun getName(): String = "I'm Android - $context"
}

// in nativeMain
// package com.jetbrains.kmpapp.platform

@Single
actual class PlatformHelper(){
actual fun getName(): String = "I'm Native"
}