我正在配置新的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);
}
}
答案 0 :(得分:38)
从AppModule.class中删除以下代码并重建项目
@Provides
@Singleton
Application provideContext(SomeApplication application) {
return application;
}
答案 1 :(得分:13)
我认为这对使用@BindsInstance
和删除@Provides Application
,Dagger 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,您需要使用Fragment
,AndroidSupportInjectionModule
,而使用原生版时,您需要使用HasSupportFragmentInjector
,AndroidInjectionModule
。
答案 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.
}