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

时间:2017-05-20 07:41:32

标签: 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 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]

根据应该是正确的文件,我缺少什么?

例如,这可能是一个带有Builder的有效组件:

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

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

4 个答案:

答案 0 :(得分:38)

从AppModule.class中删除以下代码并重建项目

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

答案 1 :(得分:13)

我认为这对使用@BindsInstance和删除@Provides ApplicationDagger 2 Component Builder提供了更明确的解释:

  

@BindsInstance什么?

     

这是定义:

     
    

在组件构建器或子组件构建器上标记方法     允许实例绑定到其中的某种类型     零件。 - 源

  
     

WHAAT?我也不明白

     

以下是关于何时使用它的简单提示:

     
    

@BindsInstance方法应该优先于编写@Module     构造函数参数并立即提供这些值。 - 源

  

我来自Spring Boot,Dagger 2是OMG,因为它复杂得多。 :(

因此,根据我对Dagger 2的极其有限的经验,会发生这种情况,因为*Module带有构造函数参数,配置不正确。我仍然不知道如何使用构造函数参数正确配置Module,但我更喜欢遵循Dagger 2文档给出的推荐方法,即删除构造函数参数并使用@BindsInstance和{{ 1}}而不是。

e.g。

@Inject

@Module class NetModule { // no constructor argument here! @Inject @Named("mqttServer") // replaced by @Inject internal lateinit var mqttServer: String }

AppComponent

然后在从@Singleton @Component(modules = [AndroidSupportInjectionModule::class, AppModule::class, NetModule::class, ActivityBuilder::class]) interface AppComponent { @Component.Builder interface Builder { @BindsInstance fun application(application: Application): Builder @BindsInstance // you'll call this when setting up Dagger fun mqttServer(@Named("mqttServer") mqttServer: String): Builder fun build(): AppComponent } fun inject(app: GeoAssistantApp) } 子类构建DaggerAppComponent时提供模块的依赖关系(确保你specify the subclass name in AndroidManifest.xml):

Application

请注意,class GeoAssistantApp : Application(), HasActivityInjector, HasSupportFragmentInjector { @Inject internal lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity> @Inject internal lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector<Fragment> override fun onCreate() { super.onCreate() Log.i(GeoAssistantApp::class.java.simpleName, "Initializing DaggerAppComponent...") DaggerAppComponent.builder() // list of modules/dependencies of modules that are part of this component need to be created here too .application(this) .mqttServer(getString(R.string.mqtt_server)) .build() .inject(this) } override fun activityInjector(): AndroidInjector<Activity> { return activityDispatchingAndroidInjector } override fun supportFragmentInjector(): AndroidInjector<Fragment> { return fragmentDispatchingAndroidInjector } } support-v4 vs原生Fragment用法可能是问题的根源。例如对于support-v4,您需要使用FragmentAndroidSupportInjectionModule,而使用原生版时,您需要使用HasSupportFragmentInjectorAndroidInjectionModule

答案 2 :(得分:2)

在我的情况下,我使用的是对象模块,因此必须使用@JvmStatic进行注释

答案 3 :(得分:0)

Kotlin 答案

检查您的模块构造函数。

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

真正的用法:

@Module
class MyModule { 
   // This is example module for true usage.
}

••• 错误用法:

@Module
class MyModule constructor(application: Application) { 
   // This is example module for wrong usage.
}