Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匕首2无法进行构造函数注入_Java_Android_Dependency Injection_Dagger 2 - Fatal编程技术网

Java 匕首2无法进行构造函数注入

Java 匕首2无法进行构造函数注入,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我有一个通过dagger 2注入依赖项的活动和片段的应用程序 我能够在活动和片段中进行字段注入,但不能在其他类中进行构造函数注入。 这是我的相关代码 @Module public abstract class MainFragmentProvider { @ContributesAndroidInjector(modules = HomeFragmentModule.class) abstract HomeFragment provideHomeFragmentFactory(); }

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

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

如何编写代码,以便通过构造函数注入直接在HomePresenter中获取依赖项,而不是在模块中编写provideMethods。我这样做是因为在这种情况下,每当我想更改构造函数参数时,我也需要更改模块代码

如何在HomePresenter的构造函数中执行类似操作

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

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

}

为了注入构造函数,Dagger必须知道在哪里获得传递给它的参数,即。 你必须提供
HomeView HomeView,HomeInteractor HomeInteractor

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

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

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

我对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();
  }
}
或者,如果为主对象指定了注入方法,则可以请求:

interface SomeComponent {
  void inject(Home home);
}

class Home {
  @Inject HomePresenter presenter;

  void initialize(){
    getSomeComponent().inject(this);
  }
}
在这两种情况下,您必须确保您的
组件
包含适当的
模块
s

interface SomeComponent {
  void inject(Home home);
}

class Home {
  @Inject HomePresenter presenter;

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