Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 Dagger 2:@Component.Builder缺少所需模块或组件的setter:[appi.example.com.Dagger.AppModule]`_Java_Android_Dependency Injection_Dagger 2 - Fatal编程技术网

Java Dagger 2:@Component.Builder缺少所需模块或组件的setter:[appi.example.com.Dagger.AppModule]`

Java Dagger 2:@Component.Builder缺少所需模块或组件的setter:[appi.example.com.Dagger.AppModule]`,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我正在配置新的Dagger Android模块,但我遇到了这个错误 以下是我的组件: @AppScope @Component(modules = {AppModule.class, NetModule.class}) public interface AppComponent { @Component.Builder interface Builder { @BindsInstance Builder application(ExampleApplication ap

我正在配置新的Dagger Android模块,但我遇到了这个错误 以下是我的组件:

@AppScope
@Component(modules = {AppModule.class, NetModule.class})
public interface AppComponent {

  @Component.Builder
  interface Builder {
    @BindsInstance
    Builder application(ExampleApplication application);

    @BindsInstance
    Builder appModule(AppModule appModule);

    @BindsInstance
    Builder netModule(NetModule netModule);

    AppComponent build();
  }

  void inject(ExampleApplication __); 
...
在我的应用程序中,我是这样构建的

appComponent = DaggerAppComponent
      .builder()
      .application(this)
      .appModule(new AppModule(this))
      .netModule(new NetModule())
      .build()
      .inject(this);
但我还是收到了错误

错误:(20,3)错误:@Component.Builder缺少所需模块或组件的setter:[app.example.com.dagger.AppModule]

根据应该正确的文档,我缺少什么

例如,这可能是具有生成器的有效组件:

@Component(modules = {BackendModule.class, FrontendModule.class})
interface MyComponent {
  MyWidget myWidget();

  @Component.Builder
  interface Builder {
    MyComponent build();
    Builder backendModule(BackendModule bm);
    Builder frontendModule(FrontendModule fm);
  }
}

从AppModule.class中删除以下代码并重新生成项目

    @Provides
    @Singleton
    Application provideContext(SomeApplication application) {
        return application;
    }

我认为这为
@BindsInstance
的使用提供了更清晰的解释,删除
@提供了应用程序

@BindsInstance
什么?

定义如下:

在组件生成器或子组件生成器上标记 允许将实例绑定到 组成部分。 — 来源


什么?我也不明白在我的例子中,我使用的是一个对象模块,所以我必须用@JvmStatic注释provider方法

@Module
object GsonModule {

    @JvmStatic
    @Singleton
    @Provides
    fun provideGson() = Gson()

}

Kotlin回答

检查模块的构造函数

如果您有构造函数和应用程序参数,请将其删除

真实用法:

••错误用法:


您是否尝试在模块方法上不使用
@BindsInstance
?应用程序模块?如果您查看了上面提供的代码,一个是您自己的,另一个是dagger文档的一部分。明显的区别是,在
AppModule
NetModule
构建器方法上有一个
@BindsInstance
注释。我也得到了同样的问题答案,我想知道为什么会这样?Component.builder是AppComponent的自定义构建器。您可以为应用程序提供绑定支持。这就是AppModule如何在不提供单例的情况下获取应用程序。您使用自定义构建器,因此不需要通过AppModule构造函数传递对象。这是超级答案&@LEO极好的解释,谢谢,但现在我们如何获得应用程序实例。获得任何提供的对象的方法我很困惑,错误说我们需要添加一个setter,但实际上您删除了一个“provides”。在我看来,这不会解决问题,但会引入另一个问题,即无法
@注入应用程序,因为AppModule不再
@提供应用程序。但是你说这是可行的,你能澄清你的答案来解释它是如何工作的(非直觉的)?谢谢。一段代码片段将有助于更好地理解答案(并获得更多投票)
@Module object MainActivityModule{@JvmStatic@providezz@ActivityScope fun providezz(activity:MainActivity):Zzz{return Zzz(activity)}
@Module
class MyModule { 
   // This is example module for true usage.
}
@Module
class MyModule constructor(application: Application) { 
   // This is example module for wrong usage.
}