gpt4 book ai didi

android - 带有 Android : How do I inject the current context? 的 Dagger

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:35:41 24 4
gpt4 key购买 nike

当我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com