Java 安卓:用匕首在活动中注入差异演示者

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

假设活动具有NavigationView,其中包含3项{时间线、配置文件、程序}

我们有3个片段

我遵循MVP模式,每个片段都有它的演示者,对于DI,我使用Dagger2

我希望在导航视图中单击每个项目时将每个演示者注入活动

对于每个演示者,我创建一个模块和组件,如下所示

@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)

您可能还想阅读以下文章: