📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Especialização em Android Nativo. Recomendado revisar antes de iniciar.
v1.0 — Android Jetpack, Kotlin, Arquitetura MVVM em Camadas, Injeção com Dagger Hilt, Room Database, Padrão Repository e StateFlow Reativo
Série Prática Android Clássico — Projeto 19 de 21
- P18: Radar de Habilidades com Canvas 2D
- ➡️ P19 (este): Banco de Wakanda com MVVM & Room
- P20: Alliance Battle com Finite State Machine
- P21: Duelo Jedi com Física 2D & Colisão
O projeto Banco de Wakanda consolida a arquitetura corporativa recomendada pelo Google para engenharia de aplicativos móveis no Android: Model-View-ViewModel (MVVM) aliada à injeção de dependências com Dagger Hilt, desacoplamento da camada de dados via Repository Pattern, persistência local transacional com Room Database e exposição de estados de tela imutáveis através de StateFlow. O app gerencia a conta do tesouro real de Vibranium com histórico de transações e saldo consolidado.
Todas as camadas arquiteturais, módulos Hilt e telas residem na subpasta canônica mobile-android-kotlin/:
catalogo_projetos/android_p19_banco_mvvm_hilt/
├── assets/
│ ├── mockup_banco_fluxo.svg
│ ├── screenshot_01_banco_vazio.svg
│ ├── screenshot_02_banco_sincronizado.svg
│ └── screenshot_03_banco_dialog.svg
├── mobile-android-kotlin/
│ ├── app/
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── java/br/com/curso/bancowakanda/
│ │ │ │ ├── di/
│ │ │ │ │ └── DatabaseModule.kt
│ │ │ │ ├── data/
│ │ │ │ │ ├── TransacaoEntity.kt
│ │ │ │ │ └── TransacaoDao.kt
│ │ │ │ ├── repository/
│ │ │ │ │ └── ContaRepository.kt
│ │ │ │ ├── ui/
│ │ │ │ │ ├── ContaViewModel.kt
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ └── build.gradle
│ ├── gradle/
│ ├── build.gradle
│ ├── gradlew
│ ├── settings.gradle
│ └── README.md
└── index.md
| ID | Persona | Narrativa da Funcionalidade | Critério de Aceitação Principal | Prioridade |
|---|---|---|---|---|
| US-01 | Cidadão de Wakanda | Quero visualizar meu saldo de Vibranium no topo da tela com atualização reativa. | Exibição do valor consolidado a partir do StateFlow da ViewModel. | Alta |
| US-02 | Cidadão de Wakanda | Quero registrar depósitos e retiradas de Vibranium através de um diálogo rápido. | Inserção atômica no banco Room e recálculo instantâneo do saldo. | Alta |
| US-03 | Engenheiro de Software | Quero que a Activity não saiba como os dados são gravados no SQLite. | Isolamento estrito através do padrão Repository e ViewModel. | Alta |
| US-04 | Engenheiro de Software | Quero injetar o repositório na ViewModel automaticamente via Hilt. | Anotação @HiltViewModel com @Inject constructor. |
Média |
| US-05 | Engenheiro de QA | Quero testar a ViewModel fornecendo um repositório mockado sem tocar no banco de dados. | Testes unitários com Coroutines Test e StandardTestDispatcher. |
Baixa |
TransacaoEntity com valor, tipo (Crédito/Débito) e timestamp.ContaRepository mediando o acesso entre DAO e ViewModel.ContaViewModel expondo StateFlow<ContaUiState> imutável.Dispatchers.IO.flowchart TD
User([fa:fa-user Cidadão / Usuário])
VM[(fa:fa-layer-group ContaViewModel)]
Repo[(fa:fa-boxes-packing ContaRepository)]
DB[(fa:fa-database Room Database)]
subgraph AppWakanda ["🏛️ Banco de Wakanda (mobile-android-kotlin)"]
UC01["Consultar Saldo Consolidado"]
UC02["Efetuar Lançamento de Transação"]
UC03["Recalcular Saldo Atômico"]
UC04["Atualizar Lista no RecyclerView"]
UC05["Injetar Dependências com Hilt"]
end
User --> UC01
User --> UC02
UC01 --> VM
UC02 --> VM
VM --> Repo
Repo --> DB
DB -.->|Flow| Repo
Repo -.->|StateFlow| VM
VM -.->|StateFlow| UC04
| ID Requisito | História de Usuário | Artefato de Código | Teste de Aceitação |
|---|---|---|---|
| RF-01 | US-02 | mobile-android-kotlin/app/.../TransacaoEntity.kt |
testEntityProperties() |
| RF-02 | US-02 | mobile-android-kotlin/app/.../TransacaoDao.kt |
testDaoInsertAndList() |
| RF-03 | US-03 | mobile-android-kotlin/app/.../ContaRepository.kt |
testRepositoryAbstraction() |
| RF-04 | US-01 | mobile-android-kotlin/app/.../ContaViewModel.kt |
testViewModelEmitsUiState() |
| RF-05 | US-04 | mobile-android-kotlin/app/.../DatabaseModule.kt |
testHiltDatabaseInjection() |
ContaViewModel.kt)ℹ️ O trecho de código que ficava aqui não correspondia ao código do projeto e foi retirado. Consulte os arquivos em
mobile-android-kotlin.
cd catalogo_projetos/android_p19_banco_mvvm_hilt/mobile-android-kotlin
./gradlew test
./gradlew assembleDebug
| Checkpoint | Meta Técnica | Critério de Aceite | Status |
|---|---|---|---|
| CP-01 | Injeção Hilt Completa | Grafo de dependências gerado pelo KSP sem conflitos | PASS ✅ |
| CP-02 | Arquitetura MVVM | Separação estrita entre View, ViewModel e Repository | PASS ✅ |
| CP-03 | Persistência Relacional | Entidades e transações gravadas no Room SQLite | PASS ✅ |
| CP-04 | Reatividade com StateFlow | UI atualizada automaticamente com collectAsStateWithLifecycle |
PASS ✅ |
| CP-05 | Suíte de Testes Automatizados | Testes unitários com repositório mockado aprovados com 100% | PASS ✅ |