loe*_*chg 6 mvp android dagger
在Dagger中是否可以执行以下操作:
public abstract class Presenter<T extends BaseView> {
@Inject T mView;
public void showLoadingIndicator() {
mView.showLoading();
}
}
Run Code Online (Sandbox Code Playgroud)
(示例模块)
public class MyModule {
private MyView mView; //extends BaseView
public MyModule(MyView view) {
mView = view;
}
@Provides
public BaseView provideView() {
return mView;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用上面的模块创建一个对象图并将视图注入演示者?
我的尝试没有奏效(通常会得到"未知类'T'"的错误).我不确定我的配置是否错误或者这是否是不受支持的功能.
有一个简单/明显的解决方法可以实现相同的效果,具体取决于代码的其余部分。
通过不使用字段注入来初始化mView
基本演示者的字段,您可以将其传递到构造函数中,并让模块提供它,例如:
public abstract class Presenter<T extends BaseView> {
private final T mView;
public Presenter(T view) {
mView = view;
}
public void showLoadingIndicator() {
mView.showLoading();
}
}
Run Code Online (Sandbox Code Playgroud)
假设它是这样使用的:
public class MainPresenter extends Presenter<MainActivity> {
public MainPresenter(MainActivity view) {
super(view);
}
}
Run Code Online (Sandbox Code Playgroud)
该模块创建演示者并将视图传递给它:
@Module(injects = MainActivity.class)
public class MainModule {
private final MainActivity mMainActivity;
public MainModule(MainActivity mainActivity) {
mMainActivity = mainActivity;
}
@Provides
MainPresenter mainPresenter() {
return new MainPresenter(mMainActivity);
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我更喜欢这个,因为我更喜欢构造函数注入而不是字段注入(除了不是由 Dagger 创建的对象,例如活动或片段级别,当然,我们无法避免@Inject
)。
归档时间: |
|
查看次数: |
3835 次 |
最近记录: |