0

Crie ViewModels compartilhados com Koin

Francisco Rasia
Francisco Rasia

Que tal otimizar o fluxo de dados no seu app por meio de ViewModels compartilhados? Usando as facilidades de injeção de dependências que a biblioteca Koin oferece podemos criar ViewModels complexos, com dependências e compartilhados entre vários Fragments ou Activities.



Esse é o sexto artigo na série sobre fluxos de dados em apps Android, em que exploro as diversas maneiras de se trafegar dados em um app construído com a arquitetura MVVM. Nesse artigo vamos usar a técnica da graph resolution para fazer uma injeção de dependência e depois vamos instanciar o ViewModel por meio do delegate sharedViewModel().



🧙‍♀️O segredo arcano

Utilizar a biblioteca Koin exige um setup inicial. Nesse artigo eu mostro o passo-a-passo para fazer essa configuração. Nesse exemplo, vamos criar um ViewModel que tem um DAO (data access object) como dependência.


1. Declarar uma dependência no construtor do ViewModel


Passar a dependência como um parâmetro do construtor do ViewModel.


class MainViewModel(private val palavrasDao: PalavrasDao) : ViewModel() { 
 ...
}


2. Criar módulos para o ViewModel e para as dependências


Vamos declarar dois módulos no arquivo AppModule.kt, um para os ViewModels e outro para o DAO; usaremos single para o DAO porque queremos ter uma única instância do repositório. Aqui está o pulo do gato: ao passar a função get() como parâmetro do MainViewModel o Koin se encarregará de instanciar sua dependência, o PalavrasDao. Essa é a chamada graph resolution, e é a forma recomendada pelos desenvolvedores do Koin por ter segurança de tipo.


val viewModelModules = module {
  viewModel { MainViewModel(get()) }
}
​
val daoModules = module {
  single { PalavrasDao() }
}


3. Iniciar o container Koin e os módulos


Na classe AppApplication:


class AppApplication : Application() {
​
  override fun onCreate() {
    super.onCreate()
    startKoin{
      androidContext(this@AppApplication)
      modules(viewModelModules)
      modules(daoModules)
   }
 }
}


4. Instanciar ViewModel por meio do delegate sharedViewModel()


Em cada Fragment ou Activity em que queremos ter acesso ao ViewModel compartilhado:


private val mMainViewModel: MainViewModel by sharedViewModel()


Com isso, a instância do ViewModel será compartilhada entre todos os Fragments ou Activities.


🏹 Um exemplo prático

Vou utilizar como exemplo o app Anagrama. Você pode baixar o projeto no meu repositório ou seguir o passo-a-passo em qualquer projeto seu que empregue ViewModel e múltiplos Fragments.


💻 Repositório no github: https://github.com/chicorasia/anagrama

Use o commit 5663db34 a branch main .

Confira o passo-a-passo no vídeo: 💊 Pílula de Kotlin: SharedViewModel com Koin e databinding no Android - https://youtu.be/y1IfIGnZsJc


🎯 Conclusão

Nesse artigo nós vimos como utilizar as ferramentas de injeção de dependências da biblioteca Koin para criar ViewModels complexos e usá-los de maneira compartilhada entre vários Fragments ou Activities.


Para saber mais

📼 Playlist: databinding

https://www.youtube.com/watch?v=0709cmNFdYs&list=PL6MlDBy8PhPju2VL5ulsqJyol-2BsQ_HF

https://insert-koin.io/


📷

Photo by Raghavendra V. Konkathi on Unsplash


0
0

Comentários (1)

0
Isaias Bueno

Isaias Bueno

25/06/2021 09:42

Incrível! Muito obrigado pelas dicas!

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

Brasil