0

Insert Koin: simplificando a injeção de dependências no Android

Francisco Rasia
Francisco Rasia

Que tal simplificar a injeção de dependências? Essa é a proposta da biblioteca Koin.

No artigo anterior nós vimos como criar ViewModels com dependências usando uma classe Factory. Nesse artigo vamos descobrir como instanciar os ViewModels a partir de uma lista de componentes e também como injetar dependências no ViewModel no momento da instanciação, sem depender de uma classe Factory.

🧙‍♂️ O truque mágico

O setup do Koin vai além de importar as dependências. É necessário criar listas de componentes (módulos, serviços, etc.) e inicializar o container. Vamos ver o passo-a-passo:


1. Importar as dependências

Adicionar as seguintes linhas ao arquivo build.gradle:


dependencies {
 def koin_version = "2.1.6"
  //...
  implementation "org.koin:koin-core:$koin_version"
  implementation "org.koin:koin-android-viewmodel:$koin_version"
 } 
  


2. Criar um pacote di e, nesse pacote, um arquivo AppModule.kt

Vamos centralizar os arquivos no pacote di ("dependency injection"). O arquivo AppModule.kt vai armazenar as listas de componentes. Nesse caso teremos só a lista de ViewModels em uma constante viewModelModule:


val viewModelModule = module {
 viewModel { AlgumaCoisaViewModel() }
 viewModel { OutroViewModel() } 
 }


3. Criar uma class AppApplication

Essa classe pode ser criada no pacote raiz e extende a Application. Sobrescrever o método onCreate() para invocar a função startKoin { } e inicializar o container Koin:


class AppApplication : Application() {
​
 override fun onCreate() {
   super.onCreate()
   startKoin{
     androidContext(this@AppApplication)
     modules(viewModelModule) //referência ao AppModule
   }
 }
}


A função espera dois parâmetros: o contexto e as listas de módulos definidas no arquivo AppModule.kt.


4. Adicionar o AppApplication ao manifest.xml

Adicionar a classe recém-criada ao arquivo de manifesto; com isso, o AppApplication será inicializado antes dos fragmentos ou atividades:

<application
 android:name=".AppApplication"
 //...
</application>


5. Instanciar o ViewModel na activity por meio do delegate

Agora a diversão começa. Vamos inicializar o ViewModel em nossa Activity usando um delegate em lugar do ViewModelProvider:


private val mViewModel: AlgumaCoisaViewModel by viewModel


Com isso, será instanciado o ViewModel indicado na lista de módulos. Repare que não precisamos indicar a classe do ViewModel - o Koin se encarrega de buscar a classe correta.


🧙‍♀️ *Agora vamos dar um passo a mais e injetar uma dependência no ViewModel.*


6. Modificar o construtor do ViewModel para receber a dependênca como parâmetro

Nosso AlgumaCoisaViewModel agora espera uma instância do objeto OutraCoisa:


class AlgumaCoisaViewModel(private val outraCoisa: OutraCoisa): ViewModel() 


7. Passar uma função lambda para a declaração dos modules

Lembrando que uma função lambda tem a forma geral (entradas...) -> Retorno:


val viewModelModule = module {
 viewModel { (outraCoisa: OutraCoisa) -> AlgumaCoisaViewModel(outraCoisa) }
 viewModel { OutroViewModel() } 
 }


Agora o delegate espera um parâmetro do tipo OutraCoisa e vai retornar um AlgumaCoisaViewModel que recebe esse objeto via construtor.


8. Passar as dependências por meio de parametersOf()

A função parametersOf() espera um varargs. Nesse caso, vamos passar uma instância de OutraCoisa para o delegate:


private val mViewModel: AlgumaCoisaViewModel by viewModel {
 parametersOf(OutraCoisa())
}


E pronto! Você acaba de instanciar um ViewModel com dependência sem precisar se preocupar com a criação de uma classe Factory!


🏹 Um exemplo prático

Vou utilizar como exemplo o projeto The Ghibli Lib. Você pode baixar o projeto no meu repositório ou seguir o passo-a-passo em qualquer projeto seu que empregue ViewModel.


💻 Repositório no github: https://github.com/chicorasia/bootcamp-libghi

Use o commit b9aa2cf a branch koin .


Confira o passo-a-passo no vídeo: 💊 Pílula de Kotlin -ViewModel: Injeção de dependência com Koin - https://youtu.be/9KWh4GV3Ksw


🎯 Conclusão

Nesse artigo nós vimos como inicializar um ViewModel vinculado a uma Activity ou Fragment usando os recursos da biblioteca Koin. Também vimos como essa mesma biblioteca pode facilitar a injeção de dependências no ViewModel, tornando nosso código mais claro e conciso.


📃Para saber mais

https://insert-koin.io/


📷

Photo by Joey Banks on Unsplash



0
0

Comentários (2)

0
Isaias Bueno

Isaias Bueno

20/05/2021 10:37

Vou pesquisar cada vez mais sobre o assunto. sempre excelente seu conteúdo! Parabéns!

0
Vinicius Souza

Vinicius Souza

18/05/2021 12:25

Gostei muito do seu post Francisco. Salvei aqui pra consultar mais tarde

Arquiteto, urbanista, desenvolvedor Java & Android e criador em chefe na chicorialabs.com.br

Brasil