尝试使用 Dagger 2 实现 MVP - 如何在提供的演示者中获得对 Activity 的引用
Trying to implement MVP using Dagger 2 - How can I get a reference to the Activity in the provided presenter
我正在尝试使用 MVP 和 Dagger 设置应用,
视图是一个Activity
,它实现了一个视图界面。
public class OverviewActivity extends AppCompatActivity implements OverviewContract.View {
@Inject OverviewPresenter presenter;
@BindView(R.id.history_days) ListView HistoryLabels;
@BindView(R.id.history_events) ListView HistoryEvents;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
ButterKnife.bind(this);
DaggerOverviewComponent.create().inject(this);
}
@Override
public void showHistory(List<Exercise> history) {
// ...
}
@Override
public void updateScoreSlider(float value) {
// ...
}
@OnClick(R.id.add_event_button)
public void addEvent(View v){
// ...
}
}
主持人看起来像这样
public class OverviewPresenter implements OverviewContract.Events {
OverviewContract.View view;
public OverviewPresenter( OverviewContract.View overviewView ) {
view = overviewView;
}
@Override
public void loadHistory() {
// TODO
}
@Override
public void addNewEvent() {
// TODO
}
}
我遇到问题的地方是演示者的 提供商 。 OverviewPresenter
的依赖项之一是 OverviewActivity
,但是我应该如何将 OverviewActivity
的实例注入 OverviewPresenter
?
@Module
public class PresenterModule {
@Provides
static OverviewPresenter provideOverviewPresenter(){
return new OverviewPresenter(/* pass in the instance of the activity here?? */);
}
}
我的组件看起来像
@Component(modules = {PresenterModule.class})
public interface OverviewComponent {
void inject(OverviewActivity overviewActivity);
}
请原谅我,如果这太离谱了,我还在努力把我的头缠在匕首上。
TLDR:
我如何设置它以便我的 OverviewActivity 可以注入一个 OverviewPresenter,它本身注入了 OverviewActivity 的实例?
- 要提供 dagger 不能自己创建的东西,你需要使用一个模块。
- 要提供您的演示者,您只需使用
@Inject
注释构造函数,您不需要使用模块——也不应该。
由于你的视图实现了视图,你不能自己创建视图,dagger 也不能。因此创建一个模块来提供视图
@Module
public class OverviewModule {
OverviewView mView;
OverviewModule(OverviewView view) {
mView = view;
}
@Provides
static OverviewView provideOverviewView() {
return mView;
}
}
然后调整您的演示者以使用构造函数注入
public class OverviewPresenter implements OverviewContract.Events {
OverviewContract.View view;
@Inject
public OverviewPresenter( OverviewContract.View overviewView ) {
view = overviewView;
}
}
然后只需将模块添加到您的组件即可。
@Component(modules = {OverviewModule.class})
public interface OverviewComponent {
void inject(OverviewActivity overviewActivity);
}
现在只需注入您的演示者即可(类似这样,可能有错字):
DaggerOverviewComponent.builder().overviewModule(new OverviewModule(this)).build()
.inject(this);
可能你不应该为此使用模块,因为视图和演示者之间的 link 应该取决于生命周期,所以依赖模块对我来说有点过分了。
你的 activity 应该被注入一个演示者,但是 activity 应该调用像 presenter.accept(this) 或 presenter.takeView(this) 这样的方法......无论名字是什么 activity 可以处理事情。通常它是这样的:
- 在简历上 -> presenter.takeView(this)
- 暂停 -> presenter.dropView();
可以阅读有关 Mosby 框架的非常好的教程
http://hannesdorfmann.com/mosby/
它谈到了很多关于 MVP 模式
我正在尝试使用 MVP 和 Dagger 设置应用,
视图是一个Activity
,它实现了一个视图界面。
public class OverviewActivity extends AppCompatActivity implements OverviewContract.View {
@Inject OverviewPresenter presenter;
@BindView(R.id.history_days) ListView HistoryLabels;
@BindView(R.id.history_events) ListView HistoryEvents;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
ButterKnife.bind(this);
DaggerOverviewComponent.create().inject(this);
}
@Override
public void showHistory(List<Exercise> history) {
// ...
}
@Override
public void updateScoreSlider(float value) {
// ...
}
@OnClick(R.id.add_event_button)
public void addEvent(View v){
// ...
}
}
主持人看起来像这样
public class OverviewPresenter implements OverviewContract.Events {
OverviewContract.View view;
public OverviewPresenter( OverviewContract.View overviewView ) {
view = overviewView;
}
@Override
public void loadHistory() {
// TODO
}
@Override
public void addNewEvent() {
// TODO
}
}
我遇到问题的地方是演示者的 提供商 。 OverviewPresenter
的依赖项之一是 OverviewActivity
,但是我应该如何将 OverviewActivity
的实例注入 OverviewPresenter
?
@Module
public class PresenterModule {
@Provides
static OverviewPresenter provideOverviewPresenter(){
return new OverviewPresenter(/* pass in the instance of the activity here?? */);
}
}
我的组件看起来像
@Component(modules = {PresenterModule.class})
public interface OverviewComponent {
void inject(OverviewActivity overviewActivity);
}
请原谅我,如果这太离谱了,我还在努力把我的头缠在匕首上。
TLDR:
我如何设置它以便我的 OverviewActivity 可以注入一个 OverviewPresenter,它本身注入了 OverviewActivity 的实例?
- 要提供 dagger 不能自己创建的东西,你需要使用一个模块。
- 要提供您的演示者,您只需使用
@Inject
注释构造函数,您不需要使用模块——也不应该。
由于你的视图实现了视图,你不能自己创建视图,dagger 也不能。因此创建一个模块来提供视图
@Module
public class OverviewModule {
OverviewView mView;
OverviewModule(OverviewView view) {
mView = view;
}
@Provides
static OverviewView provideOverviewView() {
return mView;
}
}
然后调整您的演示者以使用构造函数注入
public class OverviewPresenter implements OverviewContract.Events {
OverviewContract.View view;
@Inject
public OverviewPresenter( OverviewContract.View overviewView ) {
view = overviewView;
}
}
然后只需将模块添加到您的组件即可。
@Component(modules = {OverviewModule.class})
public interface OverviewComponent {
void inject(OverviewActivity overviewActivity);
}
现在只需注入您的演示者即可(类似这样,可能有错字):
DaggerOverviewComponent.builder().overviewModule(new OverviewModule(this)).build()
.inject(this);
可能你不应该为此使用模块,因为视图和演示者之间的 link 应该取决于生命周期,所以依赖模块对我来说有点过分了。 你的 activity 应该被注入一个演示者,但是 activity 应该调用像 presenter.accept(this) 或 presenter.takeView(this) 这样的方法......无论名字是什么 activity 可以处理事情。通常它是这样的: - 在简历上 -> presenter.takeView(this) - 暂停 -> presenter.dropView();
可以阅读有关 Mosby 框架的非常好的教程 http://hannesdorfmann.com/mosby/ 它谈到了很多关于 MVP 模式