作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我使用 RoboGuice 时,我能够通过构造函数将上下文注入(inject)到我的类中,并且 RoboGuice 会选择合适的上下文(在 Activity 中注入(inject)将具有 Activity 上下文,在 Application 中注入(inject)将具有当前应用程序上下文,在 fragment 将具有 fragment 的 Activity 上下文等...)。
Dagger 有类似的方法吗?
public class Thing {
@Inject
public class Thing(Context context){
// if i'm injected in an Activity, I should be the current activity's context
// if i'm injected in an Fragment, I should be the fragment's activity context
// if i'm injected in a Service, I should be the service's context
// etc...
}
}
最佳答案
Dagger 不了解 Android。或者任何东西,真的。如果你想注入(inject)一些东西,你必须告诉 Dagger。
您可以查看如何注入(inject) Context
的示例 in the examples .在这种情况下,限定符用于区分应用程序和 Activity 。
/**
* Allow the application context to be injected but require that it be annotated with
* {@link ForApplication @Annotation} to explicitly differentiate it from an activity context.
*/
@Provides @Singleton @ForApplication Context provideApplicationContext() {
return application;
}
编辑
不,你不能注入(inject)一个不合格的类型,并根据你执行注入(inject)的上下文改变该类型的实例。 Dagger 要求在编译时知道类型的来源,并且由于对象图是不可变的,所以不能更改来源。
做到这一点的唯一方法是使用允许您指定创建对象的上下文的工厂。
public final class ThingFactory {
private final Foo foo;
private final Bar bar;
@Inject public ThingFactory(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}
public Thing get(Context context) {
return new Thing(context, foo, bar);
}
}
关于android - 带有 Android : How do I inject the current context? 的 Dagger ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436984/
我是一名优秀的程序员,十分优秀!