我想用di。在flutter中我添加了这个https://pub.dartlang.org/packages/di包我的项目,我开始阅读这篇https://webdev.dartlang.org/angular/guide/dependency-injection文章,但我并不完全理解。
所以没关系: 在服务类上使用@Injectable()注释(例如:MyServices),但是如何注入其他类? 例如,我想类似:
class MyClass{
//some variable
var asd = MyService.asd; //need inject var.
//maybe use injector.get(MyService).asd;
//but how add injector? (I don't add across constructor)
MyService.oneMethod;//need inject method
}
main(){
var injector = new ModuleInjector([new Module()
..bind(MyService)
]);
}
关键是,我不想使用构造函数。我想直接使用注射器。这可以在颤动/飞镖?
答案 0 :(得分:5)
Angulars DI包不能独立于Angular使用。
di软件包已经过时,取决于dart:mirrors
,这在Flutter中不可用
似乎有一个新的DI包正在进行中,它应该取代Angulars内置DI,并且也应该可以在Flutter或服务器端应用程序中单独使用,但是还没有预发布或源代码可用。
<强>更新强>
宣布的DI套餐无限期推迟。
答案 1 :(得分:5)
Google最近开源了一个与Flutter兼容的依赖注入框架。它可以在这里找到:https://github.com/google/inject.dart
此项目提供静态编译时依赖项注入,而不是依赖于反射在运行时注入依赖项。如果您熟悉Dagger,它似乎非常相似。
值得注意的是 - 这不是官方的Google或Dart团队项目。在撰写本文时,几乎没有文档,它目前被认为是开发人员预览。
答案 2 :(得分:0)
如果你想使用一个类作为Singleton,从我看到的,常见的用例是使用工厂构造函数。
How do you build a Singleton in Dart?
现在不必使用Flutter的任何依赖注入系统。
答案 3 :(得分:0)
我在这里也遇到了同样的问题,所以我专门为Flutter创建了一个飞镖包。它依靠工厂方法而不是mirror api,因此可以在抖动中工作。同时仍使用熟悉的IOC模式。希望这会有所帮助!
https://pub.dartlang.org/packages/flutter_simple_dependency_injection
import 'package:flutter_simple_dependency_injection/injector.dart';
void main() {
final injector = Injector.getInjector();
injector.map(Logger, (i) => new Logger(), isSingleton: true);
injector.map(String, (i) => "https://api.com/", key: "apiUrl");
injector.map(SomeService, (i) => new SomeService(i.get(Logger), i.get(String, "apiUrl")));
injector.get(SomeService).doSomething();
// passing in the [SomeService] as a generic parameter strongly types the return object.
injector.get<SomeService>(SomeService).doSomething();
}
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'");
}
}
答案 4 :(得分:0)
你好,这样的事情怎么办?非常简单的实现,Injector本身是单例的,并且还向其中添加了类。当然可以很容易地扩展。如果您正在寻找更复杂的东西,请检查以下软件包:https://pub.dartlang.org/packages/flutter_simple_dependency_injection
void main() {
Injector injector = Injector();
injector.add(() => Person('Filip'));
injector.add(() => City('New York'));
Person person = injector.get<Person>();
City city = injector.get<City>();
print(person.name);
print(city.name);
}
class Person {
String name;
Person(this.name);
}
class City {
String name;
City(this.name);
}
typedef T CreateInstanceFn<T>();
class Injector {
static final Injector _singleton = Injector._internal();
final _factories = Map<String, dynamic>();
factory Injector() {
return _singleton;
}
Injector._internal();
String _generateKey<T>(T type) {
return '${type.toString()}_instance';
}
void add<T>(CreateInstanceFn<T> createInstance) {
final typeKey = _generateKey(T);
_factories[typeKey] = createInstance();
}
T get<T>() {
final typeKey = _generateKey(T);
T instance = _factories[typeKey];
if (instance == null) {
print('Cannot find instance for type $typeKey');
}
return instance;
}
}