Dagger 2无法执行构造函数注入

时间:2018-09-20 05:25:48

标签: java android dependency-injection dagger-2

我有一个应用程序,其中包含通过匕首2注入的带有依赖项的活动和片段 我能够在活动和片段中进行字段注入,但不能在其他类中进行构造函数注入。 这是我的相关代码

@Module
public abstract class MainFragmentProvider {
  @ContributesAndroidInjector(modules = HomeFragmentModule.class)
  abstract HomeFragment provideHomeFragmentFactory();
}

@Module
public class HomeFragmentModule {
...
@Provides
 static HomePresenter provideHomePresenter(HomeView homeView, HomeInteractor homeInteractor) {
    return new HomePresenter(homeView, homeInteractor);
 }

如何编写代码,以便可以通过构造函数注入直接在HomePresenter中获得依赖关系,而不是在模块中编写ProvideMethods。之所以这样做,是因为在这种情况下,每次我想更改构造函数参数时,都需要更改模块代码。

如何在HomePresenter的构造函数中做类似的事情?

@Inject
public HomePresenter(HomeView homeView, HomeInteractor homeInteractor) {

    this.homeInteractor = homeInteractor;
    this.homeView = homeView;

}

2 个答案:

答案 0 :(得分:0)

要注入构造函数,Dagger必须知道在哪里获取传递给它的参数,即 你必须提供 HomeView homeView, HomeInteractor homeInteractor

因此,还要创建用于提供其他依赖项的方法:

@Provides
 static HomeView provideHomeView() {
    return ...
 }

@Provides
 static HomeInteractor provideHomeInteractor() {
    return ...
 }

答案 1 :(得分:0)

我对dagger 2的android扩展了解不多,但据我所知,有两种方法可以实现您所寻找的结果。

在相关组件中,您可以根据自己的类型指定方法:

interface SomeComponent {
  HomePresenter presenter(); // Method name does not matter here, only the type
}

并像这样访问它

class Home {
  HomePresenter presenter;

  void initialize() { //This could be your onCreate or wherever you typically inject
    presenter = getSomeComponent().presenter();
  }
}

,或者如果您为Home对象指定了注入方法,则可以请求它:

interface SomeComponent {
  void inject(Home home);
}

class Home {
  @Inject HomePresenter presenter;

  void initialize(){
    getSomeComponent().inject(this);
  }
}

在两种情况下,您都必须确保Component包含适当的Module