연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
flutter_simple_dependency_injection
A simple dependency injection plugin for Flutter and Dart.
This implementation does not rely on the dart reflection apis (mirrors) and favours a simple factory based approach.
This increases the performance and simplicity of this implementation.
- Support for multiple injectors (useful for unit testing or code running in isolates)
- Support for types and named types
- Support for singletons
- Support simple values (useful for configuration parameters like api keys or urls)
Any help is appreciated! Comment, suggestions, issues, PR's!
Getting Started
In your flutter or dart project add the dependency:
dependencies:
...
flutter_simple_dependency_injection: any
For help getting started with Flutter, view the online
documentation.
Usage example
Import flutter_simple_dependency_injection
import 'package:flutter_simple_dependency_injection/injector.dart';
Injector Configuration
As this injector relies on factories rather than reflection (as mirrors in not available in Flutter)
each mapped type needs to provide a factory function. In most cases this can just be a simple
new object returned function. In slightly more advanced scenarios where the type to be created relies
on other types an injector instances is passed into the factory function to allow the type of be created
to get other types it depends on (see below for examples).
import 'package:flutter_simple_dependency_injection/injector.dart';
void main() {
final injector = ModuleContainer().initialise(Injector());
injector.get<SomeService>().doSomething();
final instances = injector.getAll<SomeType>();
print(instances.length);
final instance =
injector.get<SomeOtherType>(additionalParameters: {"id": "some-id"});
print(instance.id);
}
class ModuleContainer {
Injector initialise(Injector injector) {
injector.map<Logger>((i) => Logger(), isSingleton: true);
injector.map<String>((i) => "https://api.com/", key: "apiUrl");
injector.map<SomeService>(
(i) => SomeService(i.get<Logger>(), i.get<String>(key: "apiUrl")));
injector.map<SomeType>((injector) => SomeType("0"))
..map<SomeType>((injector) => SomeType("1"), key: "One")
..map<SomeType>((injector) => SomeType("2"), key: "Two");
injector.mapWithParams<SomeOtherType>((i, p) => SomeOtherType(p["id"]));
return injector;
}
}
class Logger {
void log(String message) => print(message);
}
class SomeService {
final Logger _logger;
final String _apiUrl;
SomeService(this._logger, this._apiUrl);
void doSomething() {
_logger.log("Doing something with the api at '$_apiUrl'");
}
}
class SomeType {
final String id;
SomeType(this.id);
}
class SomeOtherType {
final String id;
SomeOtherType(this.id);
}
Remove mappings
You can remove a mapped a factory/instance at any time:
injector.removeMapping<SomeType>();
injector.removeMapping<SomeType>(key: 'some_key');
injector.removeAllMappings<SomeType>();
Multiple Injectors
The Injector class has a factory constructor that by default returns the default singleton instance of the injector. In most cases this will be enough.
However, you can pass a name into this factory constructor to return another isolated injector that is independent from the default injector. Passing in a new
injector name will create the injector if it has not be retrieved before.
final defaultInjector = Injector();
final isolatedInjector = Injector("Isolated");
To destroy an injector instance call its dispose method. The particular instance of the injector with all mappings will be removed.
Injector().dispose();
Injector("Isolated").dispose();