Dagger有可能做以下事情:
public abstract class Presenter<T extends BaseView> {
@Inject T mView;
public void showLoadingIndicator() {
mView.showLoading();
}
}
(示例模块)
public class MyModule {
private MyView mView; //extends BaseView
public MyModule(MyView view) {
mView = view;
}
@Provides
public BaseView provideView() {
return mView;
}
}
然后使用上面的模块创建一个对象图并将视图注入演示者?
我的尝试没有奏效(通常会得到“未知类'T'”的错误)。我不确定我的配置是否错误或者这是否是不受支持的功能。
答案 0 :(得分:3)
有一个简单/明显的解决方法来实现相同的功能,具体取决于代码的其余部分。
通过不使用字段注入初始化基本演示者的mView
字段,您可以将其传递给构造函数,然后让模块提供它,如:
public abstract class Presenter<T extends BaseView> {
private final T mView;
public Presenter(T view) {
mView = view;
}
public void showLoadingIndicator() {
mView.showLoading();
}
}
假设它像这样使用:
public class MainPresenter extends Presenter<MainActivity> {
public MainPresenter(MainActivity view) {
super(view);
}
}
并且模块创建演示者并将视图传递给它:
@Module(injects = MainActivity.class)
public class MainModule {
private final MainActivity mMainActivity;
public MainModule(MainActivity mainActivity) {
mMainActivity = mainActivity;
}
@Provides
MainPresenter mainPresenter() {
return new MainPresenter(mMainActivity);
}
}
无论如何我更喜欢这个,因为我更喜欢构造函数注入而不是字段注入(除了Dagger不创建的对象,例如活动或片段级别,当然我们无法避免@Inject
)。