Skip to main content

Kotlin Multiplatform Overview

Anchor DI is multiplatform by design. It runs on Android, iOS, Desktop (JVM), and Web (Wasm). Generated code lives in commonMain; platform-specific dependencies use expect / actual. This page explains how Anchor DI fits into a KMP project and what you need to know about source sets and KSP targets.


What is Kotlin Multiplatform?

Kotlin Multiplatform (KMP) lets you share code across platforms — Android, iOS, Desktop, Web — while keeping platform-specific code where it belongs. You write business logic (networking, data layer, use cases) once in Kotlin and run it everywhere. Anchor DI is built for this: the same annotations, the same API, the same mental model on all platforms.


Source Sets

In KMP, source sets define where code lives and which platforms it targets. Anchor DI uses the same structure:

Source SetUse
commonMainShared DI graph, modules, @Inject classes. Your main DI setup lives here.
androidMainAndroid-specific modules (e.g. ActivityScope), platform providers.
iosArm64Main / iosSimulatorArm64MainiOS getAnchorContributors() actual. KSP generates into target-specific dirs; you need actuals here, not iosMain.
jvmMainDesktop/JVM-specific if needed (e.g. JVM-only modules).
wasmJsMainWeb/Wasm-specific if needed.

Important for iOS: KSP generates code into iosArm64Main and iosSimulatorArm64Main, not iosMain. So you need an actual for getAnchorContributors() in both iosArm64Main and iosSimulatorArm64Main. See Platform-Specific Setup.


KSP Targets

Anchor DI uses KSP (Kotlin Symbol Processing) to generate code at compile time. You must add the KSP processor for each Kotlin target you use:

dependencies {
add("kspCommonMainMetadata", "io.github.12345debdut:anchor-di-ksp:x.x.x")
add("kspAndroid", "io.github.12345debdut:anchor-di-ksp:x.x.x")
add("kspIosArm64", "io.github.12345debdut:anchor-di-ksp:x.x.x")
add("kspIosSimulatorArm64", "io.github.12345debdut:anchor-di-ksp:x.x.x")
add("kspJvm", "io.github.12345debdut:anchor-di-ksp:x.x.x")
add("kspWasmJs", "io.github.12345debdut:anchor-di-ksp:x.x.x")
}
  • kspCommonMainMetadata — For shared code. Required if you have commonMain and use KSP there.
  • kspAndroid — For Android target.
  • kspIosArm64 / kspIosSimulatorArm64 — For iOS device and simulator.
  • kspJvm — For JVM/Desktop target.
  • kspWasmJs — For Web/Wasm target.

Add KSP only for the targets you actually use.


Platform-Specific Dependencies

When you need platform-specific types (e.g. Context on Android, UIApplication on iOS), use expect / actual:

// commonMain — expect
expect class PlatformContext

// androidMain — actual
actual class PlatformContext(private val context: Context)

// iosMain (or iosArm64Main / iosSimulatorArm64Main) — actual
actual class PlatformContext(private val application: UIApplication)

Then provide them via a module with platform-specific sources:

@Module
@InstallIn(SingletonComponent::class)
object PlatformModule {
@Provides
@Singleton
fun providePlatformContext(): PlatformContext = PlatformContext(/* platform-specific */)
}

Each platform has its own PlatformModule that provides the platform-specific PlatformContext. The shared code depends only on the PlatformContext interface; it doesn't know about Context or UIApplication.


Next Steps