Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Provider, MultiProvider e Bloc Sem Pacotes: Construindo sua Própria Infraestrutura de DI e Estados Reativos no Flutter 🏗️

Provider, MultiProvider e Bloc Sem Pacotes: Construindo sua Própria Infraestrutura de DI e Estados Reativos no Flutter

Acesse aqui o artigo completo no LinkedIn e veja o passo-a-passo detalhado de como construir uma infraestrutura robusta de injeção de dependências tipada e máquinas de estado reativas utilizando 100% dos recursos nativos da SDK do Flutter, sem pacotes de terceiros e com zero vazamentos de memória!


📱 Sobre o Projeto

Este repositório é o projeto prático de engenharia que acompanha o artigo no LinkedIn, demonstrando como se desvencilhar do lock-in de pacotes externos (como provider, flutter_bloc e get_it) através do domínio das primitivas fundamentais da linguagem Dart e da engine do Flutter:

  • Zero Dependências Externas: O pubspec.yaml contém estritamente flutter: sdk: flutter. Nenhuma biblioteca de terceiros adicionada.
  • Contêiner de Injeção O(1) (ServiceContainer):
    • Registro de Singletons (longa duração).
    • Registro de Lazy Singletons (instanciação sob demanda na primeira resolução).
    • Registro de Factories (novas instâncias a cada resolução).
    • Suporte a Child Scopes hierárquicos com fallback automático para o contêiner pai.
    • Ordem estrita de encerramento LIFO (Last-In, First-Out) via contrato Disposable.
  • Injeção na Árvore de Widgets sem Pyramid of Doom:
    • DependencyScope<T>: Injeção elegante de uma dependência individual via InheritedWidget.
    • MultiDependencyScope: Injeção de $N$ dependências em um único nó da árvore, eliminando o aninhamento excessivo de widgets.
    • BuildContextDependencyExtensions: Resolução idiomática com context.get<T>(), context.read<T>() e context.watch<T>().
  • Suíte de Reatividade Granular 100% Nativa:
    • ValueNotifier<T> com ValueListenableBuilder para estados atômicos e escalares com disparo síncrono direto.
    • ChangeNotifier com ListenableBuilder para modelos agregados de domínio e mutações em lote (batching).
    • InheritedNotifier com NotifierScope<T> e extensões context.watchNotifier<T>() / context.readNotifier<T>() para propagação reativa instantânea em tempo $O(1)$ na subárvore.
    • Listenable.merge: Composição síncrona reativa de múltiplos notifiers independentes em um único ponto de reconstrução cirúrgico.
  • Máquinas de Estado Assíncronas (StateMachine<Event, State>):
    • Fluxo unidirecional de eventos e estados desacoplado de elementos de UI.
    • Orquestração reativa assíncrona baseada em StreamController<State>.broadcast().
    • Propriedade síncrona state em cache com filtragem automática de estados duplicados (distinct).
    • StateStreamBuilder<M, S>: Widget reativo nativo com subscrição síncrona na montagem e cancelamento seguro no dispose().
  • 🛡️ Prevenção Ativa de Memory Leaks (Zero Leaks):
    • Contrato unificado Disposable para encerramento determinístico de controllers, streams e ouvintes.
    • Descarte automático de escopos locais e instâncias registradas no desempilhamento de rotas (Navigator.pop()).

🏛️ Fluxo da Infraestrutura Nativa

┌──────────────────────────────────────┐
│           DependencyScope            │
│  • Escopo Global (Raiz do App)       │
│  • SessionService (Singleton)        │
└──────────────────┬───────────────────┘
                   │
                   ▼
┌──────────────────────────────────────┐
│          MaterialApp / Home          │
└──────────────────┬───────────────────┘
                   │ Navigator.push
                   ▼
┌──────────────────────────────────────┐
│        MultiDependencyScope          │
│  • Escopo Local (Subárvore/Rota)     │
│  • CheckoutStateMachine              │
└──────────────────┬───────────────────┘
                   │
                   ▼
┌──────────────────────────────────────┐
│         StateStreamBuilder           │
│  • Reatividade Isolada               │
│  • listen() -> cancel() no dispose   │
└──────────────────┬───────────────────┘
                   │ Navigator.pop
                   ▼
┌──────────────────────────────────────┐
│      Descarte LIFO (Zero Leaks)      │
│  • MultiScope.dispose()              │
│  • StateMachine.dispose()            │
└──────────────────────────────────────┘

🛠️ Tecnologias & Configurações

  • Linguagem: Dart 3.12+
  • Framework Mobile: Flutter 3.x+ (Material 3)
  • Plataformas Homologadas: Android & iOS (mobile-only)
  • Primitivas Nativas Utilizadas: InheritedWidget, InheritedElement, InheritedNotifier, ValueNotifier, ChangeNotifier, Listenable.merge, StreamController.broadcast(), StreamSubscription, StatefulWidget, BuildContext
  • Dependências Externas: 0 (Zero)
  • Qualidade & Testes: Cobertura de testes unitários e de widgets determinísticos com verificação de zero vazamento de memória (flutter test)

🚀 Como Executar

Clone o repositório e execute os testes ou o aplicativo utilizando o Flutter SDK:

# Clonar o repositório
git clone https://github.com/articlespost/flutter_native_di_state.git
cd flutter_native_di_state

# Instalar dependências nativas
flutter pub get

# Executar a análise estática (0 erros esperados)
flutter analyze

# Executar a suíte completa de testes unitários e de widgets (16/16 testes)
flutter test

# Executar a aplicação no emulador ou dispositivo físico
flutter run

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages