假设Activity有NavigationView包含3个项目{timeline,profile,programs}
所以我们有3个片段
我遵循MVP模式,每个片段都有它的主持人和DI我使用Dagger2
我希望每个项目在导航视图中单击时将每个演示者注入活动
对于每个演示者,我创建一个像这样的模块和组件
@FragmentScope
@Component(modules =FooPresenterModule.class)
public interface FooPresenterInjector {
void inject(MainActivity mainActivity);
}
和组件
@Inject TimelinePresenterInjector mTimeLinePresenter;
@Inject ProfilePresenterInjector mProfilePresenter;
@Inject ProgramPresenterInjector mProgramPresenter;
在Activity中按字段注入演示者 - >
private void replaceTimelineFragment() {
TimeLineFragment fragment = TimeLineFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
DaggerTimelinePresenterInjector.builder()
.timeLinePresenterModule(new TimeLinePresenterModule(fragment))
.build().inject(this);
}
并且有3个用于替换片段的函数 - >
private void replaceProfileFragment() {
ProfileFragment fragment = ProfileFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
DaggerProfilePresenterInjector.builder()
.timeLinePresenterModule(new ProfilePresenterModule(fragment))
.build().inject(this);
}
替换profile fragment func - >
function
但是当我重建项目时我得到错误
这是错误的模式吗? 如果是,为活动注入不同的主持人的最佳模式是什么?
答案 0 :(得分:0)
您正在尝试将依赖注入框架调用“绑定”到应用程序的业务逻辑(即,当您的应用程序内发生某些事件时执行注入)。这真的不是一个好主意。
通过沿着这条路走下去,你的DI逻辑会与你的应用程序的业务逻辑纠缠在一起,这将使调试和维护它变得更加困难。
“最佳模式”(IMHO唯一的模式)是在Activity的onCreate()
方法中执行一次注入。从您的代码中不清楚为什么要在FooPresenterModule
中引用Fragments,但我强烈建议您为此找到不同的解决方案。
一种可能的解决方案是将一些PresenterFactory
类注入Activity,并在切换到另一个片段时调用mPresenterFactory.getPresenterForFragment(fragment)
。
您可能还想阅读这篇文章:Dependency Injection in Android。