Java Dagger 2:@Component.Builder缺少所需模块或组件的setter:[appi.example.com.Dagger.AppModule]`
我正在配置新的Dagger Android模块,但我遇到了这个错误 以下是我的组件: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
@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.
}