【问题标题】:Android :inject difference presenter in activity with DaggerAndroid:使用 Dagger 在活动中注入差异演示者
【发布时间】:2016-11-02 10:13:18
【问题描述】:

假设 Activity 有 NavigationView 和 3 个项目 {timeline , profile,programs}

所以我们有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);

}

在Activity中按字段注入presenter ->

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

}

替换配置文件片段功能->

private void replaceProfileFragment() {

    ProfileFragment fragment = ProfileFragment.newInstance();
    getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();

    DaggerProfilePresenterInjector.builder()
            .timeLinePresenterModule(new ProfilePresenterModule(fragment))
            .build().inject(this);

}

但是当我重建项目时出现错误

这是错误的模式吗? 如果是,在活动中注入不同演示者的最佳模式是什么?

【问题讨论】:

    标签: java android dependency-injection dagger


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多