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!
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.yamlcontém estritamenteflutter: 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 viaInheritedWidget. -
MultiDependencyScope: Injeção de$N$ dependências em um único nó da árvore, eliminando o aninhamento excessivo de widgets. -
BuildContextDependencyExtensions: Resolução idiomática comcontext.get<T>(),context.read<T>()econtext.watch<T>().
-
-
Suíte de Reatividade Granular 100% Nativa:
-
ValueNotifier<T>comValueListenableBuilderpara estados atômicos e escalares com disparo síncrono direto. -
ChangeNotifiercomListenableBuilderpara modelos agregados de domínio e mutações em lote (batching). -
InheritedNotifiercomNotifierScope<T>e extensõescontext.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
stateem 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 nodispose().
-
🛡️ Prevenção Ativa de Memory Leaks (Zero Leaks):
- Contrato unificado
Disposablepara encerramento determinístico de controllers, streams e ouvintes. - Descarte automático de escopos locais e instâncias registradas no desempilhamento de rotas (
Navigator.pop()).
- Contrato unificado
┌──────────────────────────────────────┐
│ 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() │
└──────────────────────────────────────┘
- 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)
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