无法使用 Dagger 2 注入 class
Unable to inject class with Dagger 2
我正在尝试将 Dagger 2 添加到我的 Android 项目中。我想我已经理解了构建图表的概念。那时我在黑暗中拍摄,这就是我出错的地方。
一切都可以编译,但注入的字段在运行时为空。
我试图通过将 Presenter 注入我的 MainActivity 来开始。我已经编写了以下代码,如果您能帮助我找出哪里出了问题,我将不胜感激。
我的PresenterModule.java:
@Module
public class PresenterModule {
@Provides MainActivityPresenter providesMainActivityPresenter() {
return new DefaultMainActivityPresenter();
}
}
我的应用程序 class,其中还包括我的组件,遵循 Dagger2 示例代码:
public class App extends Application {
private PresenterComponent component;
@Singleton
@Component(modules = PresenterModule.class)
public interface PresenterComponent {
void inject(App app);
void inject(MainActivity activity);
}
@Override public void onCreate() {
Log.d("App.java", "Starting Application");
super.onCreate();
component = DaggerApp_PresenterComponent.builder()
.presenterModule(new PresenterModule())
.build();
component.inject(this);
}
public PresenterComponent component() {
return component;
}
}
最后是我的 MainActivity。
public class DefaultMainActivity
extends ActionBarActivity
implements MainActivity
{
@Inject MainActivityPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((App)getApplication()).component().inject(this);
mPresenter.getCurrentDetailLineNumber();
setContentView(R.layout.base_layout);
getSupportActionBar();
mContainer = (Container) findViewById(R.id.container);
mPresenter.requestCurrentScreen();
}
要注入的实际对象是接口的实现,但在其他方面是 POJO 对象:
public class DefaultMainActivityPresenter implements MainActivityPresenter {
private static final int SCREEN_BROWSER = 0;
private static final int SCREEN_DETAIL = 1;
LineNumber mCurrentDetailLineNumber;
int mCurrentScreen;
@Inject
public DefaultMainActivityPresenter() {
}
...
}
将 PresenterComponent 更改为以下将解决您的问题:
@Singleton
@Component(modules = PresenterModule.class)
public interface PresenterComponent {
void inject(App app);
void inject(DefaultMainActivity activity);
}
这是由于协方差:
虽然类型的成员注入方法将接受其子类型的实例,但只会注入参数类型及其超类型的注入注释成员;子类型的成员不会。例如,给定以下类型,当传递给成员注入方法 injectSelf(Self instance):
时,只有 a 和 b 会被注入到 Child 的实例中
class Parent {
@Inject A a;
}
class Self extends Parent {
@Inject B b;
}
class Child extends Self {
@Inject C c;
}
我正在尝试将 Dagger 2 添加到我的 Android 项目中。我想我已经理解了构建图表的概念。那时我在黑暗中拍摄,这就是我出错的地方。
一切都可以编译,但注入的字段在运行时为空。
我试图通过将 Presenter 注入我的 MainActivity 来开始。我已经编写了以下代码,如果您能帮助我找出哪里出了问题,我将不胜感激。
我的PresenterModule.java:
@Module
public class PresenterModule {
@Provides MainActivityPresenter providesMainActivityPresenter() {
return new DefaultMainActivityPresenter();
}
}
我的应用程序 class,其中还包括我的组件,遵循 Dagger2 示例代码:
public class App extends Application {
private PresenterComponent component;
@Singleton
@Component(modules = PresenterModule.class)
public interface PresenterComponent {
void inject(App app);
void inject(MainActivity activity);
}
@Override public void onCreate() {
Log.d("App.java", "Starting Application");
super.onCreate();
component = DaggerApp_PresenterComponent.builder()
.presenterModule(new PresenterModule())
.build();
component.inject(this);
}
public PresenterComponent component() {
return component;
}
}
最后是我的 MainActivity。
public class DefaultMainActivity
extends ActionBarActivity
implements MainActivity
{
@Inject MainActivityPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((App)getApplication()).component().inject(this);
mPresenter.getCurrentDetailLineNumber();
setContentView(R.layout.base_layout);
getSupportActionBar();
mContainer = (Container) findViewById(R.id.container);
mPresenter.requestCurrentScreen();
}
要注入的实际对象是接口的实现,但在其他方面是 POJO 对象:
public class DefaultMainActivityPresenter implements MainActivityPresenter {
private static final int SCREEN_BROWSER = 0;
private static final int SCREEN_DETAIL = 1;
LineNumber mCurrentDetailLineNumber;
int mCurrentScreen;
@Inject
public DefaultMainActivityPresenter() {
}
...
}
将 PresenterComponent 更改为以下将解决您的问题:
@Singleton
@Component(modules = PresenterModule.class)
public interface PresenterComponent {
void inject(App app);
void inject(DefaultMainActivity activity);
}
这是由于协方差: 虽然类型的成员注入方法将接受其子类型的实例,但只会注入参数类型及其超类型的注入注释成员;子类型的成员不会。例如,给定以下类型,当传递给成员注入方法 injectSelf(Self instance):
时,只有 a 和 b 会被注入到 Child 的实例中 class Parent {
@Inject A a;
}
class Self extends Parent {
@Inject B b;
}
class Child extends Self {
@Inject C c;
}