跳至主要内容

Kotlin 多平台應用程式中定義與模組的註解 (Annotations)

KSP 設定

請依照官方文檔中的 KSP 設定進行操作:KSP with Kotlin Multiplatform

您也可以查看 Hello Koin KMP 專案,其中包含 Koin Annotations 的基本設定。

新增 KSP Plugin (外掛)

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 Components

在您的 commonMain sourceSet 中,您只需要宣告一個 Module (模組),來掃描將擁有您的 expect class (預期類別) 或 function (函數) 的原生實作的 package (包)。

下方我們有一個 PlatformModule,在 com.jetbrains.kmpapp.platform package 中掃描,該 package 中有 PlatformHelper expect class。該 module class 使用 @Module@ComponentScan annotations 進行註解。

// in commonMain

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

// package com.jetbrains.kmpapp.platform

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

產生的程式碼在每個 platform (平台) 實作中完成。模組 package 掃描將收集正確的平台實作。

註解原生 Components

在每個實作 sourceSet 中,您現在可以定義正確的平台實作。這些實作使用 @Single 進行註解(可以是另一個定義 annotation):

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