📊 Capítulo 10: Arquitetura MVVM & MVI
Especialização em Mobile Nativo Android
🗺️ O Ciclo de Vida do ViewModel & Fluxo Unidirecional MVI
flowchart TD
ACTIVITY["Activity (Pode ser destruída na rotação de tela)"]
--> VM["ViewModel (PERSISTE na memória durante rotações de tela!)"]
VM --> STATE["_uiState: MutableStateFlow<UiState>"]
STATE --> COLLECT["uiState.collectAsStateWithLifecycle()"]
COLLECT --> COMPOSE["@Composable UI Screen"]
COMPOSE --> |"Emite UserIntent (ex: onRefreshClicked)"| VM
VM --> REPO["Repository / UseCase (Busca dados no Banco/API)"]
style ACTIVITY fill:#ffebee,stroke:#d32f2f,stroke-width:2px
style VM fill:#ede7f6,stroke:#512da8,stroke-width:2px
style STATE fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style COLLECT fill:#e1f5fe,stroke:#03a9f4,stroke-width:1.5px
style COMPOSE fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style REPO fill:#c8e6c9,stroke:#2e7d32,stroke-width:1.5px
🎯 Slide 1: Por Que Usar ViewModel?
-
Isolamento de Negócio: Mantém a interface do Compose 100% livre de regras de negócio, chamadas HTTP ou consultas a banco de dados.
- Sobrevivência à Rotação: O estado da aplicação não é perdido quando o usuário gira o smartphone.
🎯 Slide 2: Coleta Segura com collectAsStateWithLifecycle()
@Composable
fun ListaProdutosScreen(viewModel: ProdutosViewModel = viewModel()) {
// Pausa a coleta de fluxo se o aplicativo for para segundo plano (economiza bateria!)
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
when (val state = uiState) {
is UiState.Loading -> TelaCarregando()
is UiState.Success -> ListaProdutos(state.dados)
is UiState.Error -> TelaErro(state.mensagem)
}
}
🎯 Slide 3: MVI (Model-View-Intent)
- Reduz todos os eventos do usuário a uma única interface selada de
Intent/Event, tornando o aplicativo 100% determinístico e fácil de reproduzir em testes de regressão.
🔗 Navegação do Capítulo 10
| 📖 Ler Conteúdo Completo | 🧠 Fazer Quiz | 💻 Ver Exemplos | 🧩 Exercícios |
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim