[英]Dagger 2 injection not work with @ContributesAndroidInjector
I have this module for my activities bindings: 我的活动绑定有以下模块:
@Module
abstract class ActivityBuilder {
@ActivityScope
@ContributesAndroidInjector(modules = [BaseActivityModule::class])
abstract fun bindsActivity(): BaseActivity
@ActivityScope
@ContributesAndroidInjector(modules = [MainActivityModule::class])
abstract fun bindMainActivity(): MainActivity
}
BaseActivityModule BaseActivityModule
@Module
abstract class BaseActivityModule {
@Binds
@ActivityScope
abstract fun provideProgressDialogManager(manager: ProgressDialogManager): ProgressManager
}
ProgressDialogManager ProgressDialogManager
class ProgressDialogManager : ProgressManager {
private var activity: Activity;
private var instance: AtomicReference<ProgressDialog> = AtomicReference<ProgressDialog>();
@Inject
constructor(activity: BaseActivity){
this.activity = activity as Activity
this.instance.set(getDialog())
}
My component: 我的组件:
@Singleton
@Component(modules = [ApplicationModule::class, AndroidSupportInjectionModule::class, ActivityBuilder::class, ApplicationServiceModule::class, HTTPClientModule::class, ServicesModule::class])
public interface AceleraApplicationComponent : AndroidInjector<DaggerApplication> {
fun inject(app: AceleraApplication)
override fun inject(instance: DaggerApplication)
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AceleraApplicationComponent
}
}
but if i do this: 但是如果我这样做:
abstract class BaseActivity : DaggerAppCompatActivity(), SalesforceActivityInterface, BaseView {
private var logger: Logger = br.com.rede.acelera.util.Logger.create(javaClass)
private var sf: SalesforceActivityDelegate = SalesforceActivityDelegate(this)
@Inject
lateinit var progress: ProgressManager
}
i have this build error: 我有这个构建错误:
e: /Users/rafael-iteris/Documents/afvc/acelera/app/build/tmp/kapt3/stubs/devProdDebug/br/com/rede/acelera/component/AceleraApplicationComponent.java:6: error: [dagger.android.AndroidInjector.inject(T)] br.com.rede.acelera.util.ProgressManager cannot be provided without an @Provides- or @Produces-annotated method. e:/Users/rafael-iteris/Documents/afvc/acelera/app/build/tmp/kapt3/stubs/devProdDebug/br/com/rede/acelera/component/AceleraApplicationComponent.java:6:错误:[dagger.android。如果没有@ Provides-或@ Produces-批注的方法,则无法提供br.com.rede.acelera.util.ProgressManager的AndroidInjector.inject(T)。 e: E:
e: public abstract interface AceleraApplicationComponent extends dagger.android.AndroidInjector { e: ^ e: br.com.rede.acelera.util.ProgressManager is injected at e: br.com.rede.acelera.base.BaseActivity.progress e: e:公共抽象接口AceleraApplicationComponent扩展了dagger.android.AndroidInjector {e:^ e:br.com.rede.acelera.util.ProgressManager注入e:br.com.rede.acelera.base.BaseActivity.progress e:
br.com.rede.acelera.activity.main.MainActivity is injected at e: br.com.rede.acelera.activity.main.MainActivity在以下位置注入:
dagger.android.AndroidInjector.inject(arg0) e: A binding with matching key exists in component: br.com.rede.acelera.module.ActivityBuilder_BindsActivity.BaseActivitySubcomponent e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing dagger.android.AndroidInjector.inject(arg0)e:组件中存在带有匹配键的绑定:br.com.rede.acelera.module.ActivityBuilder_BindsActivity.BaseActivitySubcomponent e:java.lang.IllegalStateException:无法分析:org.jetbrains。 kotlin.kapt3.diagnostic.KaptError:批注处理时出错
any idea why? 知道为什么吗?
Dagger starts injecting dependencies from subclasses, even if your AndroidInjection.inject(this)
is in your base class (or you extend from DaggerAppCompatActivity
). 即使您的AndroidInjection.inject(this)
在基类中(或从DaggerAppCompatActivity
扩展而来),Dagger AndroidInjection.inject(this)
从子类中注入依赖DaggerAppCompatActivity
。
Then it looks for subclass definitions in your ActivityBuilder
. 然后,它在ActivityBuilder
查找子类定义。
So, to inject into an abstract base class, you need to provide that dependency (via Module in ActivityBuilder
) in every subclass of it. 因此,要注入抽象基类,您需要在其每个子类中提供该依赖项(通过ActivityBuilder
中的Module)。
@Module
abstract class ActivityBuilder {
@ActivityScope
@ContributesAndroidInjector(modules = [MainActivityModule::class, BaseActivityModule::class])
abstract fun bindMainActivity(): MainActivity
}
try using this BaseActivityModule, and remove the @Inject annotation from the ProgressDialogManager constructor. 请尝试使用此BaseActivityModule,然后从ProgressDialogManager构造函数中删除@Inject批注。
@Module
class BaseActivityModule {
@Provide
@ActivityScope
fun provideProgressDialogManager(activity: BaseActivity): ProgressManager {
return ProgressDialogManager(activity)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.