Kotlin Academy · Aula

Injeção de dependências em KMP com Koin

Conecte módulos compartilhados usando Koin em uma configuração multiplataforma.

Aula 4 de 414 etapas

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 AppDelegate

Resolvendo 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.

Grátis para começar

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

  1. Estrutura de projeto KMP: commonMain, androidMain, iosMain
  2. Mecanismo expect/actual para APIs de plataforma
  3. Compartilhando camadas de repositório e casos de uso
  4. Injeção de dependências em KMP com Koin
← Voltar para Kotlin Academy