Android:使用Dagger在活动中注入差异演示者

时间:2016-11-02 10:13:18

标签: java android dependency-injection dagger

假设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

但是当我重建项目时我得到错误

这是错误的模式吗? 如果是,为活动注入不同的主持人的最佳模式是什么?

1 个答案:

答案 0 :(得分:0)

您正在尝试将依赖注入框架调用“绑定”到应用程序的业务逻辑(即,当您的应用程序内发生某些事件时执行注入)。这真的不是一个好主意。

通过沿着这条路走下去,你的DI逻辑会与你的应用程序的业务逻辑纠缠在一起,这将使调试和维护它变得更加困难。

“最佳模式”(IMHO唯一的模式)是在Activity的onCreate()方法中执行一次注入。从您的代码中不清楚为什么要在FooPresenterModule中引用Fragments,但我强烈建议您为此找到不同的解决方案。

一种可能的解决方案是将一些PresenterFactory类注入Activity,并在切换到另一个片段时调用mPresenterFactory.getPresenterForFragment(fragment)

您可能还想阅读这篇文章:Dependency Injection in Android