Java Dagger:android.content.Context上没有可注入成员。是否要添加可注入构造函数?课程对模块的要求
我正在尝试将我的singletonJava Dagger:android.content.Context上没有可注入成员。是否要添加可注入构造函数?课程对模块的要求,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我正在尝试将我的singletonCookieUtil与Dagger一起注入到LoginActivityCookieUtil接受一个应用程序上下文,因此我设置了以下结构: 雄激素模块 CookieUtil(我想注入LoginActivity的内容) LoginActivity(我想在其中注入CookieUtil) 公共类LoginActivity扩展了BaseActivity{ @注入CookieUtil CookieUtil @Override protected void onCreate(
CookieUtil
与Dagger一起注入到LoginActivity
CookieUtil
接受一个应用程序上下文
,因此我设置了以下结构:
雄激素模块
CookieUtil(我想注入LoginActivity的内容)
LoginActivity(我想在其中注入CookieUtil)
公共类LoginActivity扩展了BaseActivity{
@注入CookieUtil CookieUtil
@Override
protected void onCreate(Bundle savedInstanceState) {
// use CookieUtil ...
}
}
我还设置了Dagger示例中的所有bootstraping内容,以使一切正常工作
基本活动
应用程序
当我运行代码时,我得到
android.content.Context上没有可注入成员。是否要添加
可注入构造函数?AndroidModule的CookieUtil要求
我做错了什么
在我看来,一切仍然像魔术一样,因为我不完全知道如何将一切连接起来,所以非常感谢您的详细解释
另外,如果有人能给我一个关于dagger模块的解释,我会很有帮助,什么时候分为两个不同的模块才有意义?它们通常绑定哪些逻辑片段
谢谢
编辑
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不能有私有构造函数,并且仍然可以由Dagger创建(配置)。您可以有一个包友好的构造函数,然后它应该在没有
@提供CookiUtil…
的情况下工作。使用该方法为您控制的类提供了方法,并可能使其成为可注入的,这似乎是浪费
一般来说,Dagger根据其类型(带有具体类型参数,如Foo
)以及任何@限定符来考虑“绑定”。因此类型Foo
与应用程序Foo
的类型@不同。只要出现@Inject
,就会请求绑定,只要出现@Provides
,就会提供绑定(或者对于非限定绑定,如果类具有标记为@Inject
的构造函数或字段,则提供隐式绑定。对于每个@Inject
字段或构造函数参数,该键必须有一个当前绑定。Dagger需要能够看到它用于创建内容的方法,因此通常为private
字段、方法和构造函数是不可能的
此外,请不要在没有限定符的情况下简单地注入上下文
。或者更好的方法是,如果这是上下文
子类型,则注入应用程序
或活动
。如果你不区分Android调用的30000个上下文
子类型,你的图表将无法管理。(snark)谢谢。(应用程序
以前在那里,我没有提到过,对不起)我已经将构造函数更改为public,并用@Inject
而不是上面的成员注入对其进行了注释。我对答案进行了一些编辑以显示我的更改。仍然会出现相同的错误。我希望CookieUtil
成为一个广泛应用程序实用程序类,我可以在需要时随时注入它(即LoginActivity
)作为一个单身汉使用。我对DI还不熟悉,还在这里尝试着找出我的步骤。尝试着从示例中学习,但它们非常稀少,文档假定了一定程度的知识。顺便说一句,问题不在于你,而在于安卓团队将一切都作为一个上下文。:DUnderstandable:)尽管如此,我还是很想将dagger添加到我的项目中,只是似乎找不到一个完全符合我要求的示例(一个需要上下文的单例类)。我觉得我在大概的范围内,但尝试过任何可能的组合,但似乎从未成功。即将失去希望并继续前进,如果你知道可能有什么问题,请与世界其他人分享。嗯……你的CookieUtil不注入@ForProvides Context
它只注入Context
。你需要@Pr提供您注入的同一类型…包括@Qualifier
注释。此外,我将使@提供的方法中的PersistentCookieStore在CookieUtil类中不是新的,因此您不会在CookieUtil的单元测试中测试PersistentCookieStore。
@Override
protected void onCreate(Bundle savedInstanceState) {
// use CookieUtil ...
}
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 {
}
@Singleton
public class CookieUtil {
private Context mContext;
private PersistentCookieStore persistentCookieStore;
@Inject
public CookieUtil(Context context) {
// use injected context
mContext = context
persistentCookieStore = new PersistentCookieStore(mContext);
// ...
}
}