Android 上的 Dagger 2 @Singleton未注入注释的类
我目前正在尝试将Dagger 2集成到Android应用程序中。我的项目设置如下:
- 图书馆
- 应用程序(取决于库)
在我的库项目中,我定义了一个类,稍后我将将其注入到库和应用程序项目中需要它的其他类(活动和常规类)中。
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
现在 - 例如,在我的片段或活动或常规类中,我会注入上面的单例,如下所示:
public class SomeClass{
@Inject
MyManager myManager;
}
至少我是这么想的,因为在实践中,myManager 总是空的。显然,它的构造函数也从未被调用过,所以我想我一定错过了一些配置方面的东西?或者也许我误解了文档,它根本不打算以这种方式工作?MyManager 类的目的是成为一个应用程序范围的可访问组件累积实体 - 这就是我选择@Singleton的原因。
更新
为了避免混淆:我在评论中提到了我在某个地方有组件,我认为 - 这指的是“基于组件的设计”意义上的组件,与匕首无关。我拥有的基于匕首的代码都在上面列出 - 在我的代码中没有其他与匕首相关的代码。
当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 - 查看这个关于如何正确设置dagger2的真正有用的线程:https://stackoverflow.com/a/29943394/1041533
更新 2
以下是我根据G. Lombard的建议更新的代码 - 我更改了代码如下 - 原始的Singleton在库项目中:
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
在库项目中还有引导类:
@Singleton
@Component
public interface Bootstrap {
void initialize(Activity activity);
}
然后,我在我的活动中使用上面的Bootstrap类(在我的具体应用程序中,而不是在库项目中!但是,我在库中也有类/活动,可以访问Bootstrap以注入MyManager):
public class MyActivity extends Activity{
@Inject
MyManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//DONT DO THIS !!! AS EXPLAINED BY EpicPandaForce
DaggerBootstrap.create().initialize(this);
}
}
但即使在这条线之后:
DaggerBootstrap.create().initialize(this);
管理器实例仍为空,即未注入。
我刚刚发现这个:https://stackoverflow.com/a/29326023/1041533
如果我没有误读,这意味着我需要指定Bootstrap类中的每个类,这些类将使用@Inject来注入内容。可悲的是 - 这不是一个选择,因为我有40多个课程和活动,我必须这样做。
这意味着我的Bootstrap界面显然必须看起来像这样:
@Singleton
@Component
public interface Bootstrap {
void initialize(ActivityA activity);
void initialize(ActivityB activity);
void initialize(ActivityC activity);
void initialize(ActivityD activity);
void initialize(ActivityE activity);
void initialize(ActivityF activity);
//and so on and so forth...
}
如果上述情况属实,那么对于我的用例来说,这是不值得的。另外:似乎没有编译时检查,如果我忘记在这里指定我的40多个类中的一个?它只是不起作用 - 即在运行时使应用程序崩溃。