Como controlar estados da View usando Sealed Class

Um código mais organizado na comunicação entre a ViewModel e a View.

Jean Dobler
Accenture Digital Product Dev
3 min readDec 9, 2019

--

Algo que deve incomodar muitos desenvolvedores atualmente é o modo como a ViewModel se comunica com a View. Boa parte dos exemplos que encontramos na internet funcionam bem, porém acaba não sendo uma solução centralizada e, com o tempo, dependendo do tamanho do seu app, deixa o código bem desorganizado.

Neste post vamos mostrar uma solução simples para esse problema, utilizando um pouco do conceito de Programação Reativa. A ideia é ter apenas 1 meio para controlar o fluxo de mensagens de uma parte da aplicação, com uma Sealed Class para montar a hierarquia de “estados de tela” e 1 observer na View para receber as mensagens.

Tem exemplos para ficar mais claro? Sim, tem exemplos! Neste código vamos consultar uma lista de filmes para serem exibidos e usar a ViewModel para pegar os dados do Repository e Retornar a View.

Primeiro um exemplo sem a solução.

Parece que ficou bom desse jeito, não é? Simples e prático, mas a vida é uma caixinha de surpresas. E se quisermos agora mostrar uma mensagem de erro, como faríamos?

Começou a ficar bagunçado!

Agora a View precisa ter 2 observers separados e, se quisermos adicionar mais ações, teremos que ficar criando Observers infinitamente ou começarmos a tirar a lógica do ViewModel e colocarmos na View, removendo essa centralização de controle que estamos tentando criar.

Vamos agora aplicar o conceito do post para organizar o envio de mensagens entre ViewModel e a View.

Primeiro, criamos uma Sealed Class que vai representar os “estados da tela”. No nosso caso, como estamos na tela de Movie vamos criar a MovieViewState (sim, criamos um state para cada View).

Agora, dentro da ViewModel vamos instanciar um MutableLiveData, que vai receber o tipo da SealedClass que acabamos de criar ao invés da lista de filmes.

Para aplicações menos complexas, que não exigem muitas customizações de estado de tela, podemos criar uma SealedClass genérica. Vamos chamá-la de NetworkViewState.

Ficou bem melhor, não é mesmo? Agora podemos adicionar várias interações com a View, mantendo a mesma estrutura e deixando o código bem mais organizado. Ficou alguma dúvida ou tem alguma coisa a dizer? Deixe um comentário. Até a próxima!

--

--

Jean Dobler
Accenture Digital Product Dev

Android and FullStack Web developer, World Of Warcraft Lover, Piranha Plant Player(SSBU) and a father of 2 cats