simple é uma biblioteca Dart leve e direta para injeção de dependência e localização de serviços. Ela ajuda a desacoplar a construção e o consumo de suas classes, facilitando a gerência de dependências em seus projetos Dart e Flutter.
Adicione o simple ao seu arquivo pubspec.yaml:
dependencies:
simple: ^1.0.0 # Verifique a versão mais recenteEm seguida, execute pub get ou flutter pub get.
A utilização da biblioteca é focada na classe Simple, que gerencia o registro e a recuperação de suas classes (dependências).
Primeiro, obtenha a instância do Simple:
import'package:simple_dependency_injection/simple_dependency_injection.dart';
final simple =Simple();Um singleton é uma instância única que será compartilhada em toda a aplicação. A instância é criada no momento do registro.
Use addSingleton<T>(() => T()) para registrar:
classApiService {
voidfetchData() =>print('Dados recebidos!');
}
// Registra uma instância única de ApiService
simple.addSingleton<ApiService>(() =>ApiService());Para obter a instância, use get<T>():
// Em qualquer lugar da sua aplicaçãofinal api = simple.get<ApiService>();
api.fetchData(); // Saída: Dados recebidos!Uma factory cria uma nova instância da classe toda vez que get<T>() é chamado.
Use addFactory<T>(() => T()) para registrar:
classViewController {
finalint creationHash;
ViewController() : creationHash =DateTime.now().hashCode;
}
// Registra uma factory para ViewController
simple.addFactory<ViewController>(() =>ViewController());Ao obter a instância, uma nova será criada a cada chamada:
final controller1 = simple.get<ViewController>();
final controller2 = simple.get<ViewController>();
print(controller1.creationHash); // Saída: 12345print(controller2.creationHash); // Saída: 67890 (diferente)Você pode substituir uma dependência já registrada usando update<T>(). Isso é útil para testes (mocking) ou para alterar a implementação em tempo de execução.
// Suponha que ApiService já foi registradoclassMockApiServiceimplementsApiService {
@overridevoidfetchData() =>print('Dados de teste recebidos!');
}
// Atualiza a implementação de ApiService
simple.update<ApiService>(() =>MockApiService());
final api = simple.get<ApiService>();
api.fetchData(); // Saída: Dados de teste recebidos!Você pode remover todas as dependências registradas com reset() ou clear().
clear(): Limpa todas as instâncias registradas.reset(): Também limpa tudo, mas executa novamente a função destartUp, se ela foi definida.
simple.reset(); // Limpa todas as instânciasimport'package:simple_dependency_injection/simple_dependency_injection.dart';
// --- Classes de exemplo ---classServiceA {
Stringget message =>'Olá do Serviço A!';
}
classServiceB {
finalServiceA serviceA;
ServiceB(this.serviceA);
voiddoSomething() {
print('ServiceB diz: ${serviceA.message}');
}
}
voidmain() {
final simple =Simple();
// 1. Registrar dependências
simple.addSingleton<ServiceA>(() =>ServiceA());
simple.addFactory<ServiceB>(() =>ServiceB(simple.get<ServiceA>()));
// 2. Usar as dependênciasfinal serviceB = simple.get<ServiceB>();
serviceB.doSomething(); // Saída: ServiceB diz: Olá do Serviço A!// 3. Atualizar uma dependênciaprint('--- Atualizando ServiceA ---');
simple.update<ServiceA>(() =>MockServiceA());
final newServiceB = simple.get<ServiceB>();
newServiceB.doSomething(); // Saída: ServiceB diz: Olá do MockServiceA!// 4. Limpar tudo
simple.reset();
print('Instâncias limpas.');
try {
simple.get<ServiceA>();
} catch (e) {
print(e); // Lança uma exceção, pois a instância não existe mais
}
}
// Classe de mock para o exemplo de atualizaçãoclassMockServiceAimplementsServiceA {
@overrideStringget message =>'Olá do MockServiceA!';
}