Pular para conteúdo

Aula 20 - Projeto Capstone: App Flutter Multiplataforma Autônomo 🚀

Objetivo Pedagógico

Objetivo: Conceber e consolidar um aplicativo Flutter multiplataforma (Android, iOS e Web) completo: arquitetura limpa em camadas (Data, Domain, Presentation com BLoC), internacionalização (i18n), persistência local com Isar/Hive e pipeline automatizado de testes e compilação.


📑 1. Fundamentos Teóricos & Análise Técnica

O Projeto Capstone de Flutter coroa a capacitação em desenvolvimento multiplataforma profissional: 1. Clean Architecture Adaptada ao Flutter: - Camada Presentation: BLoCs, Widgets reutilizáveis, gerenciamento de temas claro/escuro dinâmicos. - Camada Domain: Casos de uso atômicos puros e repositórios abstratos, testáveis em milissegundos sem necessidade do motor gráfico. - Camada Data: Implementação dos repositórios, persistência local ultrarrápida (Isar/Hive) e clientes HTTP (Dio com interceptors). 2. Design Responsivo e Adaptativo: - Renderização fluida que ajusta widgets para toque (Mobile Touch) ou teclado e mouse (Desktop/Web), respeitando as convenções de cada sistema (Material 3 no Android e estilo Cupertino no iOS). 3. Pipeline de Qualidade Automatizada: - Execução de flutter analyze, suíte de testes de widgets (testWidgets) e testes de integração com cobertura calculada via lcov.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    App["Flutter Core Application"] --> Presentation["Presentation Layer (BLoC + Responsive Widgets)"]
    Presentation --> Domain["Domain Layer (UseCases & Entities)"]
    Domain --> Data["Data Layer (Repository Impl)"]
    Data --> LocalDB["Local Database (Isar / Hive Cache)"]
    Data --> RemoteAPI["Remote REST API (Dio Interceptor)"]
    style App fill:#e1f5fe,stroke:#01579b
    style Presentation fill:#fff3e0,stroke:#e65100
    style Domain fill:#f3e5f5,stroke:#7b1fa2
    style Data fill:#e8f5e9,stroke:#2e7d32
    style LocalDB fill:#e0f2f1,stroke:#00695c

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Multiplataforma Verdadeiro (Single Codebase): Uma única base de código em Dart servindo compilações nativas para ARM64 e Webassembly (Wasm). - Controle Granular de Cache: Estratégia Cache-First que entrega dados instantaneamente do banco local enquanto valida alterações na nuvem. - Injeção de Dependências com GetIt: Service locator leve e determinístico que desacopla classes de infraestrutura. - Testes Automatizados de Widgets: Garantia de que gestos de usuário e transições de tela mantenham o comportamento esperado.


🛠️ 2. Implementação Prática em Engenharia Flutter Completa, BLoC, Clean Architecture e CI/CD

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// get_orders_usecase.dart (Caso de Uso Puro e Teste de Widget em Flutter)
import 'package:equatable/equatable.dart';

// Entidade de Domínio Pura
class OrderEntity extends Equatable {
  final String id;
  final String title;
  final double amount;

  const OrderEntity({required this.id, required this.title, required this.amount});

  @override
  List<Object?> get props => [id, title, amount];
}

// Contrato de Repositório Abstrato
abstract class OrdersRepository {
  Future<List<OrderEntity>> getOrders();
}

// Caso de Uso Atômico (Clean Architecture)
class GetOrdersUseCase {
  final OrdersRepository repository;
  GetOrdersUseCase(this.repository);

  Future<List<OrderEntity>> execute() async {
    final orders = await repository.getOrders();
    // Aplica ordenação de negócio por valor decrescente
    orders.sort((a, b) => b.amount.compareTo(a.amount));
    return orders;
  }
}

💡 Análise Passo a Passo do Código

  1. Entidade Pura sem Framework: A classe OrderEntity é completamente independente de bibliotecas de terceiros ou componentes do Flutter.
  2. Inversão de Dependências: O caso de uso depende apenas do contrato abstrato OrdersRepository, facilitando testes unitários.
  3. Ordenação e Regra de Domínio: Encapsula o ordenamento de valor decrescente dentro do caso de uso, evitando duplicidade de regras em telas distintas.

🎯 3. Próximos Passos & Sequência Didática