Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
ahmed3elshaer avatar

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)
At a glance

koin-patterns capabilities & compatibility

Capabilities
dependency injection · viewmodel injection · di testing
From the docs

What koin-patterns says it does

Pragmatic DI for Kotlin with Koin.
SKILL.md
Koin dependency injection patterns for Android with modules, scopes, and ViewModel injection.
SKILL.md
npx skills add https://github.com/ahmed3elshaer/everything-claude-code-mobile --skill koin-patterns

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs39
repo stars60
Last updatedJune 14, 2026
Repositoryahmed3elshaer/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

SKILL.mdMarkdownGitHub ↗

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.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.