
Koin Patterns
- 39 installs
- 60 repo stars
- Updated June 14, 2026
- ahmed3elshaer/everything-claude-code-mobile
koin-patterns is a Claude Code skill that provides Koin dependency injection patterns for Android with modules, scopes, and ViewModel injection.
About
koin-patterns is a Claude Code skill that provides Koin dependency injection patterns for Android. It covers module setup, application startKoin configuration, ViewModel injection in Compose via koinViewModel(), scopes, named qualifiers, and testing with KoinTestRule. A developer uses it when wiring up DI in a Kotlin/Compose Android app.
- Koin dependency injection patterns for Android
- Modules, scopes, qualifiers, and ViewModel injection in Compose
- Test setup with KoinTestRule for injecting mocks
Koin Patterns by the numbers
- 39 all-time installs (skills.sh)
- Ranked #630 of 1,039 Mobile Development skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
koin-patterns capabilities & compatibility
- Capabilities
- dependency injection · viewmodel injection · di testing
What koin-patterns says it does
Pragmatic DI for Kotlin with Koin.
Koin dependency injection patterns for Android with modules, scopes, and ViewModel injection.
npx skills add https://github.com/ahmed3elshaer/everything-claude-code-mobile --skill koin-patternsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 39 |
|---|---|
| repo stars | ★ 60 |
| Last updated | June 14, 2026 |
| Repository | ahmed3elshaer/everything-claude-code-mobile ↗ |
What it does
Wire up Koin dependency injection in an Android Compose app with modules, scopes, qualifiers, and ViewModel injection.
Who is it for?
Android developers wiring dependency injection with Koin in Compose apps.
Skip if: Projects using Hilt/Dagger or non-Android stacks.
When should I use this skill?
Setting up Koin modules, scopes, or ViewModel injection in an Android app.
Files
Koin Dependency Injection
Pragmatic DI for Kotlin with Koin.
Module Setup
// AppModule.kt
val appModule = module {
// Singletons
single<AppDatabase> { Room.databaseBuilder(...).build() }
single { get<AppDatabase>().userDao() }
// Factories (new instance each time)
factory { DateFormatter() }
}
// NetworkModule.kt
val networkModule = module {
single<HttpClient> {
HttpClient(OkHttp) {
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
}
}
single<AuthApi> { AuthApiImpl(get()) }
single<UserApi> { UserApiImpl(get()) }
}
// FeatureModule.kt
val homeModule = module {
// Repository
single<HomeRepository> { HomeRepositoryImpl(get(), get()) }
// Use Cases
factory { GetItemsUseCase(get()) }
factory { GetItemUseCase(get()) }
// ViewModel
viewModel { HomeViewModel(get()) }
}Application Setup
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApp)
modules(
appModule,
networkModule,
homeModule,
detailModule
)
}
}
}ViewModel Injection
// In Compose
@Composable
fun HomeScreen(viewModel: HomeViewModel = koinViewModel()) {
val state by viewModel.state.collectAsStateWithLifecycle()
// ...
}
// With parameters
@Composable
fun DetailScreen(itemId: String) {
val viewModel: DetailViewModel = koinViewModel { parametersOf(itemId) }
// ...
}
// ViewModel definition with params
viewModel { params ->
DetailViewModel(
itemId = params.get(),
repository = get()
)
}Scopes
// Activity scope
val activityModule = module {
scope<MainActivity> {
scoped { NavigationController() }
}
}
// Usage
class MainActivity : AppCompatActivity(), KoinScopeComponent {
override val scope: Scope by activityScope()
val nav: NavigationController by inject()
}Qualifiers
val networkModule = module {
single(named("auth")) { createAuthClient() }
single(named("default")) { createDefaultClient() }
}
// Usage
class UserApi(
@Named("auth") private val client: HttpClient
)Testing
class HomeViewModelTest : KoinTest {
@get:Rule
val koinRule = KoinTestRule.create {
modules(testModule)
}
private val testModule = module {
single<HomeRepository> { mockk() }
viewModel { HomeViewModel(get()) }
}
private val viewModel: HomeViewModel by inject()
private val repository: HomeRepository by inject()
@Test
fun `loads items`() = runTest {
coEvery { repository.getItems() } returns Result.success(listOf())
// ...
}
}---
Remember: Koin is pragmatic. Keep modules organized, use scopes for lifecycle.
Related skills
FAQ
How does it inject ViewModels?
In Compose it uses koinViewModel(), including passing parameters via parametersOf for parameterized ViewModels.
Does it cover testing?
Yes, it shows KoinTest with a KoinTestRule that swaps in mock modules for unit tests.