gpt4 book ai didi

java - Dagger:android.content.Context 上没有可注入(inject)成员。你想添加一个可注入(inject)的构造函数吗?模块类要求

转载 作者:太空狗 更新时间:2023-10-29 12:42:30 26 4
gpt4 key购买 nike

我正在尝试将我的单例 CookieUtil 转换为使用 Dagger 注入(inject)到 LoginActivity 中。 CookieUtil 采用应用程序 context 为此,我设置了以下结构:

安卓模块

@Module(
injects = {
CookieUtil.class,
LoginActivity.class
},
library = true
)
public class AndroidModule {
private final App application;

public AndroidModule(App application) {
this.application = application;
}

/**
* 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;
}

@Provides
@Singleton
CookieUtil provideCookieUtil() {
return new CookieUtil();
}
}

CookieUtil(我想注入(inject)到LoginActivity中的)

@Singleton
public class CookieUtil {
@Inject Context mContext; // gets injected with a app context. is this right ?

private PersistentCookieStore persistentCookieStore;

private CookieUtil() {
// use injected mContext
persistentCookieStore = new PersistentCookieStore(mContext);
// ...
}
}

LoginActivity(我要注入(inject)CookieUtil的地方)

公共(public)类 LoginActivity 扩展 BaseActivity { @Inject CookieUtil cookieUtil;

@Override
protected void onCreate(Bundle savedInstanceState) {
// use CookieUtil ...
}

我还设置了 Dagger 示例中的所有 Bootstrap ,以使一切正常工作

基础 Activity

public class BaseActivity extends ActionBarActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Perform injection so that when this call returns all dependencies will be available for use.
((App) getApplication()).inject(this);
}
}

应用

public class App extends Application {
private ObjectGraph graph;

public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(getModules().toArray());
// ...
}

protected List<Object> getModules() {
return Arrays.asList(
new AndroidModule(this),
new CupsModule() // Another module I haven't listed
);
}

public void inject(Object object) {
graph.inject(object);
}

}

申请

@Qualifier
@Retention(RUNTIME)
public @interface ForApplication {
}

当我运行代码时,我得到

No injectable members on android.content.Context. Do you want to add an injectable constructor? required by CookieUtil for AndroidModule

我做错了什么?

对我来说,一切看起来仍然像魔法一样,因为我不完全了解如何连接一切,因此非常感谢详细的解释。

此外,如果有人能指出我对 Dagger 模块的解释,那将会很有帮助,什么时候分成两个不同的模块才有意义?他们通常绑定(bind)哪些逻辑部分?

谢谢

编辑

由 Christian Gruber 建议更改

@Singleton
public class CookieUtil {
private Context mContext;
private PersistentCookieStore persistentCookieStore;

@Inject
public CookieUtil(Context context) {
// use injected context
mContext = context
persistentCookieStore = new PersistentCookieStore(mContext);
// ...
}
}

最佳答案

Cookie 不能有一个私有(private)构造函数并且仍然由 Dagger 创建(提供)。你可以有一个包友好的构造函数,然后它应该在没有 @Provides CookiUtil ... 的情况下工作.为您控制的类提供方法并使其可注入(inject)似乎很浪费。

一般来说,Dagger 根据“键”来考虑“绑定(bind)”,“键”是它的类型(具有具体类型参数,例如 Foo<Bar> )以及任何 @Qualifier .所以输入 Foo<Bar>不同于@ForApplication Foo<Bar> .在 @Inject 的任何地方请求绑定(bind)发生,并在任何地方提供 @Provides发生(或者对于非限定绑定(bind),如果一个类有一个 @Inject 标记的构造函数或字段,则提供一个隐式绑定(bind)。对于每个 @Inject 字段或构造函数参数,必须存在该键的绑定(bind)。Dagger 需要能够看到它用来创建东西的方法,所以一般private字段、方法、构造函数是不可能的。

此外,请不要简单地注入(inject) Context没有限定词。或者更好,注入(inject) ApplicationActivity如果那是 Context你的意思是亚型。如果您不区分 Android 调用的 30,000 个事物,您的图表将无法管理 Context亚型。 (蛇鲨)

关于java - Dagger:android.content.Context 上没有可注入(inject)成员。你想添加一个可注入(inject)的构造函数吗?模块类要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317254/

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