Skip to content

Kotlin Multiplatform 应用中的定义和模块注解

KSP 设置

请按照官方文档中描述的 KSP 设置步骤进行操作:KSP 与 Kotlin Multiplatform

你也可以查看 Hello Koin KMP 项目,了解 Koin 注解的基本设置。

添加 KSP 插件

kotlin
plugins {
    alias(libs.plugins.ksp)
}

在 common API 中使用注解库:

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

并且别忘了在正确的 sourceSet 上配置 KSP:

kotlin
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)
}

声明通用模块和 KMP Expect 组件

在你的 commonMain sourceSet 中,你只需声明一个模块来扫描包含 expect 类或函数的原生实现的包。

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

kotlin
// in commonMain

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

// package com.jetbrains.kmpapp.platform 

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

NOTE

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

注解原生组件

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

kotlin
// 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"
}