ahmed3elshaer/everything-claude-code-mobile/kmp-di

Claude Code and agent skill by ahmed3elshaer/everything-claude-code-mobile

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Dependency Injection for KMP. Koin multiplatform setup, platform modules, and manual DI patterns.

Install

npx vskill@latest install ahmed3elshaer/everything-claude-code-mobile/kmp-di

SKILL.md

KMP Dependency Injection

Cross-platform dependency injection with Koin.

Koin Multiplatform Setup

Dependencies
kotlin
// build.gradle.kts (shared module)
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.insert-koin:koin-core:${koinVersion}")
implementation("io.insert-koin:koin-test:${koinVersion}")
}
}
val androidMain by getting {
dependencies {
implementation("io.insert-koin:koin-android:${koinVersion}")
}
}
}
Module Definition
kotlin
// commonMain/kotlin/di/AppModule.kt
val sharedModule = module {
// ViewModels (Android) / ScreenModels (multiplatform)
factory { HomeViewModel(get(), get()) }
factory { DetailViewModel(get()) }
// Use Cases
factory { GetUsersUseCase(get()) }
factory { GetUserDetailUseCase(get()) }
// Repositories
single<UserRepository> { UserRepositoryImpl(get(), get()) }
// Data Sources
single { UserApi(get()) }
single { createDatabase(get()) }
}
Platform Modules
kotlin
// androidMain/kotlin/di/PlatformModule.kt
val androidPlatformModule = module {
includes(sharedModule)
// Android-specific dependencies
single { android.content.Context() }
single { PlatformConnectivityMonitor(get()) }
single { PlatformFileService(get()) }
}
// iosMain/kotlin/di/PlatformModule.kt
val iosPlatformModule = module {
includes(sharedModule)
// iOS-specific dependencies
single { PlatformConnectivityMonitor() }
single { PlatformFileService() }
}

Koin Start

Android
kotlin
// androidMain/kotlin/MyApp.kt
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApp)
modules(androidPlatformModule)
}
}
}
iOS
kotlin
// iosMain/kotlin/di/KoinInit.kt
fun initKoin() {
startKoin {
modules(iosPlatformModule)
}
}
// Called from Swift
// KotlinKMMSharedKt.doInitKoin()
Compose Multiplatform
kotlin
// commonMain/kotlin/Main.kt
fun main() {
startKoin {
modules(sharedModule)
}
App()
}

ViewModel Injection

Android (ViewModel)
kotlin
// androidMain/kotlin/ui/HomeScreen.kt
@Composable
fun HomeScreen(
viewModel: HomeViewModel = koinViewModel()
) {
val state by viewModel.state.collectAsStateWithLifecycle()
HomeContent(state)
}
iOS (ScreenModel)
kotlin
// commonMain/kotlin/ui/HomeScreen.kt
@Composable
fun HomeScreen() {
val model = getScreenModel<HomeScreenModel>()
val state by model.state.collectAsState()
HomeContent(state)
}

Repository Pattern

Factory vs Single
kotlin
// ✅ factory - creates new instance each time
factory { HomeViewModel(get(), get()) }
// ✅ single - shared instance
single<UserRepository> { UserRepositoryImpl(get(), get()) }
// ✅ scoped - tied to component lifetime
scoped(HomeScope.homeScope) { HomeData(get()) }

Named Dependencies

kotlin
// ✅ Named dependencies
module {
single(named("default")) { DefaultLogger() }
single(named("analytics")) { AnalyticsLogger() }
factory { MyRepository(logger = get(named("default"))) }
}

Manual DI (Alternative)

Simple Service Locator
kotlin
// commonMain/kotlin/di/ServiceLocator.kt
object ServiceLocator {
private val services = mutableMapOf<String, Any>()
fun <T> get(key: String): T {
return services[key] as T
}
fun register(key: String, service: Any) {
services[key] = service
}
fun init() {
register("repository", UserRepositoryImpl())
register("api", UserApi())
}
}
Pure Kotlin DI
kotlin
// commonMain/kotlin/di/AppContainer.kt
class AppContainer(
private val platformService: PlatformService
) {
val api: UserApi = UserApi()
val database: AppDatabase = createDatabase()
val userRepository: UserRepository by lazy {
UserRepositoryImpl(api, database)
}
val homeViewModel: HomeViewModel by lazy {
HomeViewModel(userRepository, platformService)
}
}

Testing with DI

kotlin
// commonTest/kotlin/di/TestModule.kt
val testModule = module {
single<MockUserService> { MockUserService() }
single<UserService>(override = true) { get<MockUserService>() }
}
// In tests
@BeforeTest
fun setup() {
startKoin { modules(testModule) }
}
@AfterTest
fun tearDown() {
stopKoin()
}

Remember: DI simplifies testing. Use it to inject mocks and fakes easily.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
46
Repository forks
8
7-day trend score
19

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 13 May 2026, 5 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/ahmed3elshaer/everything-claude-code-mobile/kmp-di/badge)](https://verified-skill.com/skills/ahmed3elshaer/everything-claude-code-mobile/kmp-di)

Something wrong with this skill or its page? Tell us.