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