Injeção de dependências em KMP com Koin
Conecte módulos compartilhados usando Koin em uma configuração multiplataforma.
Injeção de dependências em KMP com Koin é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.
Por que usar DI em KMP?
A Injeção de Dependências desacopla a criação dos componentes de seu uso. Em KMP, Koin é o framework de DI preferido porque é Kotlin puro e funciona em commonMain sem processadores de anotações.
// No annotation processing needed — Koin uses lambda DSL
// Add to build.gradle.kts:
// implementation("io.insert-koin:koin-core:3.5.0")
// androidMain: koin-android
// iosMain: no extra dep
fun main() { println("Koin works on all KMP targets") }DSL de módulos do Koin
Defina as vinculações em um bloco module { } usando single, factory ou scoped.
import org.koin.core.module.dsl.*
import org.koin.dsl.*
val appModule = module {
single { HttpClient() } // one instance
single<UserRepository> { RemoteUserRepository(get()) }
factory { GetUserUseCase(get()) } // new instance each time
}Módulo compartilhado em commonMain
Defina um módulo Koin compartilhado em commonMain. Os módulos da plataforma o estendem com vinculações específicas da plataforma.
// commonMain/di/SharedModule.kt
import org.koin.dsl.module
fun sharedModule() = module {
single<UserRepository> { RemoteUserRepository(get()) }
single { GetUserUseCase(get()) }
single { UserViewModel(get()) }
}Módulo da plataforma em androidMain
Os módulos da plataforma fornecem o mecanismo HTTP real, o driver do banco de dados e os singletons específicos do Android.
// androidMain/di/AndroidModule.kt
import io.ktor.client.engine.okhttp.*
import org.koin.dsl.module
fun androidModule() = module {
single { OkHttp.create() } // Ktor engine
single { createHttpClient(get()) }
includes(sharedModule())
}startKoin na Application do Android
Chame startKoin { } em Application.onCreate do Android. Use androidContext(this) para disponibilizar o contexto.
// androidMain:
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
// In Application.onCreate():
startKoin {
androidContext(this@MyApp)
modules(androidModule())
}Iniciando o Koin no iOS
No iOS, chame KoinApplication.start() a partir do AppDelegate ou da estrutura App do Swift, passando os módulos compartilhados do Koin.
// iosMain/KoinInit.kt:
import org.koin.core.context.startKoin
fun initKoin() {
startKoin {
modules(iosModule())
}
}
// Swift: KoinInitKt.doInitKoin() in AppDelegateResolvendo dependências
Nos ViewModels ou casos de uso de commonMain, use get() dentro de um módulo ou inject() / getKoin().get() nos pontos de chamada.
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class UserViewModel : KoinComponent {
private val getUser: GetUserUseCase by inject()
fun load(id: String) = runBlocking { getUser(id) }
}Escopos do Koin para ViewModels
Use viewModel { } no módulo do Android para ViewModels do Android ou o factory { } independente da plataforma para VMs compartilhados.
// androidMain (with koin-android):
import org.koin.androidx.viewmodel.dsl.viewModel
val androidVmModule = module {
viewModel { UserViewModel(get()) }
}
// In Compose:
// val vm: UserViewModel = koinViewModel()Testes com Koin
Use startKoin na configuração dos testes com um módulo de teste que substitua as dependências reais por implementações falsas.
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
class UserViewModelTest {
@BeforeTest fun setup() {
startKoin { modules(module {
single<UserRepository> { FakeUserRepository() }
single { GetUserUseCase(get()) }
})}
}
@AfterTest fun teardown() = stopKoin()
}Único versus fábrica versus com escopo
único: uma instância durante todo o ciclo de vida do aplicativo. fábrica: uma nova instância a cada get(). com escopo: uma instância por escopo do Koin (por exemplo, o escopo da tela).
import org.koin.dsl.module
val lifetimeModule = module {
single { Database() } // shared, one instance
factory { Analytics() } // new on each get()
scope<ScreenScope> {
scoped { ScreenViewModel() } // one per screen lifecycle
}
}Koin versus DI manual versus Hilt
Koin: multiplataforma, sem KSP/KAPT, DI em tempo de execução. Hilt: somente Android, em tempo de compilação e orientado por anotações. DI manual: controle máximo, sem sobrecarga de framework. Projetos KMP usam Koin para compartilhar componentes.
fun main() {
// Koin : commonMain, runtime, lambda DSL
// Hilt : androidMain only, compile-time
// Manual: no framework, explicit wiring in factory/module files
println("Choose Koin for KMP; Hilt for Android-only projects")
}Injeção tardia com by inject()
by inject() resolve uma dependência de forma tardia, no primeiro acesso — útil em classes que implementam KoinComponent.
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class AppService : KoinComponent {
private val repo: UserRepository by inject() // resolved on first use
fun doWork() = println(repo.javaClass.simpleName)
}Verificação rápida
Qual escopo do Koin cria uma nova instância sempre que get() é chamado?
Recapitulação
O Koin usa uma DSL baseada em lambdas, sem processamento de anotações — ideal para KMP. Defina os módulos compartilhados em commonMain e os módulos da plataforma nos conjuntos de origem específicos da plataforma. Use single para singletons, factory para instâncias novas e by inject() para resolução tardia.
Aprenda Kotlin com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 51
- Aulas
- 203
Perguntas Frequentes
A aula “Injeção de dependências em KMP com Koin” é grátis?
Sim — o texto completo de “Injeção de dependências em KMP com Koin” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.
O que vou aprender em “Injeção de dependências em KMP com Koin”?
Conecte módulos compartilhados usando Koin em uma configuração multiplataforma. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Kotlin Academy?
Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Injeção de dependências em KMP com Koin”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Kotlin Academy?
Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Estrutura de projeto KMP: commonMain, androidMain, iosMain
- Mecanismo expect/actual para APIs de plataforma
- Compartilhando camadas de repositório e casos de uso
- Injeção de dependências em KMP com Koin