【发布时间】:2015-03-18 22:11:33
【问题描述】:
我正在为我的 Android 应用程序遵循 MVC 模式,并且遇到过几次这个问题并且不得不解决它。 当我的应用程序能够使用字段上的 @Inject 注释创建注入对象时,该对象的 @Inject 字段为空,通常会导致崩溃。例如,我有处理逻辑的控制器类和流动。任何片段/活动都会回调到它们的控制器以通知用户交互/状态更改。但是,注入的Controller实例通常为null。
我将举一个简单的例子来说明。下面,控制器创建了一个注入的活动,然后通过添加一个片段来使用它来启动流程。处理了该依赖关系,但未处理对控制器的活动依赖关系(即 null)。
处理业务逻辑和流程的简单控制器类:
public class SomeController {
@Inject
SomeActivity someActivity;
private SomeComponent component;
private final Application app;
@Inject
public SomeController(Application app) {
this.app = app;
}
private void startActivity() {
component = Dagger_SomeComponent().builder()
.someModule(app)
.build();
someActivity.getFragmentManager().beginTransaction().
.add(R.id.content, SomeFragment.class, null)
.commit();
}
public void activityStarted() {
//callback when Activity is ready...
}
}
处理用户交互并回调控制器以执行一些业务逻辑的简单活动:
public class SomeActivity extends Activity {
@Inject
SomeController controller;
private void controllerCallback() {
//notify controller of something here...
}
}
用于将对象注入图形的简单模块类:
@Module
public class SomeModule {
private Application app;
public SomeModule(Application app) {
this.app = app;
}
@Provides
@Singleton
SomeController provideSomeController( return new SomeController(app); )
@Provides
SomeActivity provideSomeActivity( return new SomeActivity();)
}
提供消费对象方法的简单组件类:
@Component
public interface SomeComponent {
void addController(SomeController controller);
SomeController controller();
SomeActivity activity();
}
【问题讨论】:
-
你初始化组件吗?你在哪里注入这个对象? Dagger-2 没有使用反射机制
-
对,应该添加。将其编辑。试图将其精简为基本要素,以便更容易讨论我一直在解决这个问题的原因/原因/方式。假设应用程序在想要启动该功能时在控制器上调用 startActivity()。
-
也忘记将 Activity 添加到模块。这就是我从记忆中得到的。所以,我的理解是,Module 会为 SomeActivity 提供任何可注入字段,这似乎发生在 Controller 中,但是为什么 Activity 的 Controller 的可注入字段 == null?
-
什么是一些Activity是扩展Activity的对象
-
我的意思是 SomeActivity 类
标签: java android dependency-injection dagger-2