Aula 07 - Arquitetura Moderna (MVVM) 🏗️
Objetivo
Objetivo: Entender por que não devemos colocar toda a lógica na Activity (God Class) e aprender o padrão MVVM (Model-View-ViewModel), recomendado pelo Google.
1. O Problema da "God Activity" 🦸♂️
Se você colocar lógica de banco de dados, validação, chamadas de API e controle de UI tudo na MainActivity, ela vai virar um monstro de 2.000 linhas. * Dificil de testar. * Dificil de manter. * Perde dados ao girar a tela (rotação destrói a Activity).
2. O Padrão MVVM 📐
Separamos as responsabilidades em 3 camadas:
- Model: Dados e Lógica de Negócio (Banco, API, Classes de Dados).
- View: UI (Activity/Fragment/XML). Só exibe dados e captura cliques. Não pensa!
- ViewModel: O cérebro da tela. Guarda o estado (dados) e sobrevive à rotação de tela.
graph LR
View["View (Activity/XML)"] <-->|Observa| VM[ViewModel]
VM -->|Pede Dados| Model["Model (Repository)"]
Model -->|Retorna Dados| VM 🆚 Comparação: MVC (iOS Clássico) vs MVVM
No iOS antigo (MVC), a ViewController fazia o papel de View e Controller, sofrendo do mesmo problema ("Massive View Controller"). Hoje, iOS também usa muito MVVM (com SwiftUI ou UIKit).
3. ViewModel e LiveData 📡
ViewModel
Classe que herda de androidx.lifecycle.ViewModel.
class MainViewModel : ViewModel() {
// LiveData: Um dado observável
val textoBemVindo = MutableLiveData<String>()
fun carregarDados() {
// Simula busca de dados
textoBemVindo.value = "Olá, Aluno!"
}
}
LiveData
É um container de dados que respeita o ciclo de vida. A View "observa" o LiveData. Se a View morrer (onDestroy), ela para de observar automaticamente.
4. Conectando na Activity (View) 🔌
class MainActivity : AppCompatActivity() {
// 1. Instanciar o ViewModel (forma moderna)
private val viewModel: MainViewModel by viewModels()
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 2. Observar o LiveData
viewModel.textoBemVindo.observe(this) { novoTexto ->
// Toda vez que o valor mudar, isso roda automaticamente!
binding.txtTitulo.text = novoTexto
}
binding.btnCarregar.setOnClickListener {
viewModel.carregarDados()
}
}
}
5. Vantagens do MVVM
- Rotação de Tela: Se girar o celular, a Activity morre e recria. O ViewModel NÃO morre. Os dados continuam lá (
novoTextojá estará carregado). - Testabilidade: É fácil testar o ViewModel sem precisar de emulador Android.
- Separação: O designer mexe no XML, o dev mexe no ViewModel.
6. Data Binding (O próximo nível) 🧬
Podemos ligar o XML direto no ViewModel, sem nem precisar de código na Activity para atualizar textos.
XML:
(Não aprofundaremos Data Binding agora, focaremos no ViewBinding + LiveData/Flow).7. Desafio: Contador MVVM 🔢
Crie um app "Contador de Cliques". 1. Sem MVVM: Variável count na Activity. Gire a tela. O contador zera? (Sim). 2. Com MVVM: Mova a variável count para um ViewModel (MutableLiveData<Int>). * Botão chama viewModel.incrementar(). * Activity observa e atualiza o TextView. * Gire a tela. O contador zera? (Não! 🤩).
🔗 Materiais da Aula
-
Slides
Material visual com diagramas e conceitos-chave.
-
Quiz
Teste seu conhecimento com 10 questões interativas.
-
Exercícios
5 exercícios progressivos (básico → desafio).
-
Projeto
Aplicação prática dos conceitos da aula.