0

Android com Preferences DataStore - Parte 2

#Kotlin #Android
Francisco Rasia
Francisco Rasia

Esse artigo é a segunda parte do mergulho em Preferences DataStore, o componente do Android Jetpack que é apresentado como a maneira mais atual de se gravar e acessar dados no Android.

O Preferences DataStore tem a proposta de substituir o SharedPreferences, armazenando os dados de maneira assíncrona, segura e transacional.

Os exemplos e experiências relatados nesse artigo se referem ao app DrinkCoffee, que estou desenvolvendo como um exercício de exploração em persistência de dados no Android. Links para o repositório no final do artigo.


TL;DR : Uma maneira de utilizar Preferences DataStore para atualizar a UI em tempo real, substituindo o ViewModel e os observers
📼 Guia em vídeo: https://youtu.be/mHge7swMl4Y


Está em alpha. O que isso quer dizer?

A biblioteca DataStore ainda está em fase alpha, o que significa que a cada nova atualização algumas implementações deixar de funcionar e novas funcionalidades são adicionadas.

No projeto do app DrinkCoffee, a implementação feita com o alpha 0.4 se tornou inviável com a alpha 0.8 (versão corrente); as mudanças foram profundas, pois enquando a versão 0.4 permitia o acesso do ViewModel às preferências sem necessitar do contexto, a versão 0.8 já não trazia essa possibilidade.

Em outras palavras: se prepare para fortes emoções e tutoriais e artigos desatualizados quando descer por esse buraco de coelho! 🐰


Usando Flow e corrotinas

O objeto Flow<T>, retornado pelas funções de acesso à DataStore, emite um valor sempre que uma preferência é atualizada.

Como se lê na documentação:

"Em corrotinas, um fluxo é um tipo que pode emitir vários valores sequencialmente, ao contrário das funções de suspensão, que retornam somente um valor. Por exemplo, você pode usar um fluxo para receber atualizações em tempo real de um banco de dados. Os fluxos são criados com base nas corrotinas e podem fornecer vários valores. Conceitualmente, um fluxo é um stream de dados que pode ser computado de forma assíncrona."


Assim, para atualizar os dados na tela conforme as modificações no arquivo, basta coletar os dados e atribuí-los aos elementos da UI; fazemos isso por meio do operador terminal collect { }.

No nosso exemplo, vamos atribuir o único valor a um campo do tipo EditText:

lifecycleScope.launch {
      read(KEY_COFFEE_COUNT).collect {
          quantityTxt.text = it.toString()
      }

E pronto! Com essas três linhas de código conseguimos substituir o ViewModel, que era o antigo responsável por manter os dados e fazer as operações de incrementar e resetar o contador.

Assim, não estamos mais realizando operações em dobro (atualizar valor no ViewModel e gravar o novo valor nas preferências); em vez disso, fazemos uma única operação de atualizar a UI cada vez que o valor gravado é modificado.

(Quer saber mais:? Assista o passo a passo no vídeo, ao final dessa postagem.)


E o ViewModel?

Agora que estamos observando as mudanças nos dados gravados, o ViewModel ficou redundante - pois sua principal finalidade era manter o contador de maneira independente do ciclo de vida da activity principal.

Dessa maneira, não precisamos mais inicializar o ViewModel com os dados gravados nem gravar dados a partir do ViewModel. Na verdade, não temos mais qualquer necessidade do ViewModel e ele pode ser eliminado.


Conclusão

Essa foi uma daquelas situações que a solução aparece rapidamente depois que deixamos de lado uma premissa de projeto.

No instante que eu mudei o paradigma, abandonando o ViewModel, as peças caíram nos seus lugares e a solução apareceu - uma decisão por vezes difícil de tomar, seja pelo custo de retrabalho, seja pela crença que vai encontrar uma solução, seja pela sensação de estar jogando fora o que já havia sido feito.

Mas é importante frisar que esta não é uma solução universal! A arquitetura MVVM é uma forma muito robusta, funcional e poderosa de se construir apps para o Android - só que não era a melhor solução para esse modesto app.



Para saber mais:

📑 Aritgo: Shared Preferences x Preferences DataStore - Parte 1

💻 Github: https://github.com/chicorasia/bootcamp-drinkcoffee/tree/exercicio-datastore-parte2

📖 Documentação: https://developer.android.com/kotlin/flow?hl=pt-br

📼 Passo a passo em vídeo: https://youtu.be/mHge7swMl4Y


📷

Jan Antonin Kolar on Unsplash

0
9

Comentários (1)

0
Felipe

Felipe

08/04/2021 19:46

Excelente artigo Francisco, parabéns!

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

Brasil