📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Flutter. Recomendado revisar antes de começar.
v2.0 — Flutter 3, Dart, Clean Architecture, flutter_bloc, GetIt e Equatable
Trilha de Especialização Pedagógica — Projeto 2 de 4
- v1: App Financeiro · Flutter 3 · Provider · Material 3
- ➡️ v2 (este): Clean Architecture · BLoC Pattern (
flutter_bloc) · GetIt · Dartz- v3: App Offline-First com Banco NoSQL Hive & Sincronização
- v4: Super-App Omnichannel com Biometria & Push FCM
🎓 Nível Profissional Simulado: Desenvolvedor Flutter Pleno / Engenheiro Mobile. O padrão BLoC (Business Logic Component) com Clean Architecture é o padrão ouro adotado por bancos (Nubank, C6 Bank) e unicórnios de tecnologia para garantir separação estrita de responsabilidades e desacoplamento total da interface visual.
—`
Construir o módulo de Conta Digital e Transferências Pix em Flutter 3, aplicando a Clean Architecture em camadas (Domain, Data, Presentation), fluxo unidirecional de eventos e estados via flutter_bloc, injeção de dependências com get_it e estados imutáveis com Equatable.
—`
“Precisamos refatorar nosso fluxo de transferência Pix. A lógica não pode ficar dentro dos widgets da tela. Exigimos o padrão BLoC com eventos explícitos (
CarregarSaldoEvent,RealizarPixEvent), estados atômicos de tela (ContaLoading,ContaLoaded,ContaError) e injeção de dependências para podermos trocar a fonte de dados de Mock para API REST sem tocar na UI.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Carregar saldo da conta bancária emitindo estados ContaLoading e ContaLoaded. |
“estados atômicos de tela” |
| RF02 | Funcional | Processar transferência Pix com validação de saldo insuficiente emitindo ContaError. |
“validação de saldo no Pix” |
| RF03 | Funcional | Reagir com BlocConsumer para atualização de UI e exibição de SnackBars. |
“padrão BLoC com eventos” |
| RNF01 | Não-Funcional | Desacoplamento da camada de domínio em relação ao framework Flutter (dartz/Either). |
Clean Architecture |
| RNF02 | Não-Funcional | Imutabilidade e comparação por valor com Equatable. |
Previsibilidade de Estado |
—`
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como correntista, quero ver o saldo da minha conta carregar com feedback visual de progresso. | Alta |
| US02 | Como usuário, quero ser alertado imediatamente se tentar transferir mais do que meu saldo permite. | Alta |
—`
# Branch da funcionalidade
git checkout -b feature/US01-flutter-clean-bloc
# Executar a aplicacao Flutter no emulador
flutter run
—`
conta_bloc.dart)class ContaBloc extends Bloc<ContaEvent, ContaState> {
double _saldoAtual = 5420.50;
ContaBloc() : super(ContaInitial()) {
on<CarregarSaldoEvent>((event, emit) async {
emit(ContaLoading());
await Future.delayed(const Duration(milliseconds: 600));
emit(ContaLoaded(_saldoAtual));
});
on<RealizarPixEvent>((event, emit) async {
emit(ContaLoading());
if (event.valor > _saldoAtual) {
emit(const ContaError('Saldo insuficiente para realizar o Pix.'));
} else {
_saldoAtual -= event.valor;
emit(ContaLoaded(_saldoAtual));
}
});
}
}
—`
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd mobile_flutter_02_bloc_cleanarch
flutter pub get
flutter run
flutter test
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd proj_aplicacoes_full_stack/projetos/mobile_flutter_02_bloc_cleanarch`
—`
// Teste unitário de BLoC com bloc_test
blocTest<ContaBloc, ContaState>(
'emite [ContaLoading, ContaLoaded] ao carregar saldo com sucesso',
build: () => ContaBloc(),
act: (bloc) => bloc.add(CarregarSaldoEvent()),
expect: () => [ContaLoading(), const ContaLoaded(5420.50)],
);
—`
- Clean Architecture com BLoC implementada e testada.
BlocConsumergerenciando renderização e SnackBars de erro.
| ⬅️ Ver Todos os Projetos no Super-Hub | 🏠 Página Inicial do Portal |