O aplicativo Rick and Morty demonstra o desenvolvimento Android moderno utilizado Hilt, Coroutines, Flow, Jetpack (Compose, Paging 3, Room, ViewModel), baseada na arquitetura MVVM.
- Feito em Kotlin, Coroutines + Flow: para chamadas assíncronas.
- Utiliza Jetpack Compose: um toolkit moderno para criação de telas nativas.
- Retrofit2 & OkHttp3: para as chamadas REST.
- Room: para persistência dos dados (offline). Provê uma camada de abstração sobre SQLite.
- Paging 3: biblioteca da família Jetpack que facilita o carregamento de informações e apresentação na tela, dando suporta à paginaçãoo a cache.
- Hilt: para injeção de dependências.
- Kotlin Serialization: para decodificação JSON
- Desenvolvido no Android Studio Flamingo | 2022.2.1 Patch 2
Rick and Morty se baseia na arquitetura MVVM e no Repository pattern, que segue a Guia de arquiterura oficial do Google.
- Cada camada segue um fluxo unidirecional de eventos/dados; a camada de UI emite eventos para a camada de dados e esta expõe um stream de dados para as outras camadas.
- A camada de dados é projetada para funcionar independentemente de outras camadas e deve ser pura, o que significa que não possui nenhuma dependência das outras camadas.
A camada se configura com elementos de UI, como telas, e interagem com o usuário e um ViewModel que guarda os estados da aplicaçào.
Com a utilização do Jetpack Compose, toda a camada visual é escrita em Kotlin, não fazendo uso do tradicional layout em XML.
A camada de dados é formada por um repositório, que realiza consultas ao dados locais (banco de dados) e requisições remotas à internet. Foi implementada para ser offline-first, seguindo o princípio single source of truth.
A tela principal lista todos os personagens disponiveis e realiza a paginação, carregando mais dados, quando necessário.
Clicano em um personagem, é possível ver mais detalhes
Ao rotacionar a tela, a disposição das informações é alterada, para melhor visualização
É possível realizar uma busca pelo nome e status do personagem
-
Optou-se por utilizar as últimas versões das bibliotecas do compose e material 3 atualmente disponíveis, o que implica na adição de anotações
Experimental
em partes do projeto, sendo sujeitas a mudanças futuras. Assumui-se também que este projeto não entraria em produção e foi então utilizado como um experimento das novas releases. -
O projeto utilizou o Jetpack Compose podendo fazer uso do mais novo toolkit de desenvolvimento nativo oficial, descrevento a camada de UI puramente em Koltlin e de modo declarativo. Em um projeto de uma aplicação comercial, construir a aplicação utilizando este paradigma pode facilitar uma futura migração para Kotlin Multiplataforma se a intenção for criar aplicações para múltiplos sistemas, facilitando o reaproveitamento de código.
-
Para a paginação dos dados foi utilizada a biblioteca Paging 3, através da implementação de um
RemoteMediator
que realiza uma integração fluida com a biblioteca Room deixando transparente para os consumidores o fluxo de dados que automaticamente retorna somente do cache local (banco de dados) caso haja falta de conexão à internet. -
Este projeto não possui use cases, o view model consome o flow diretamente do repositório. O motivo foi o fato do stream de dados conter a classe
PagingData
, parte da biblioteca Paging 3. Se considerarmos que a camada de domínio somente contém classes Kotlin puras, sem conhecimento de outras bibliotecas, aqui do framework Android, adicionar um use case entre a camada de dados (repositório) e de apresentação (view model), seria uma "violação" deste princípio já que o use case teria conhecimento da classsePagingData
, adicionando uma dependência.