简体   繁体   English

Dagger 2注入不适用于@ContributesAndroidInjector

[英]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.

相关问题 Dagger 2.10-ContributesAndroidInjector批注 - Dagger 2.10 - ContributesAndroidInjector annotation Dagger 2 ContributesAndroidInjector 为模块提供活动 - Dagger 2 ContributesAndroidInjector provide activity to module Kotlin,Dagger2,MVVM和ContributesAndroidInjector - Kotlin, Dagger2, MVVM and ContributesAndroidInjector 如何使用kotlin在匕首中生成包含@ContributesAndroidInjector的模块? - How to generate module consisting @ContributesAndroidInjector in dagger with kotlin? Dagger 2.11:使用@ContributesAndroidInjector时的Local Singleton - Dagger 2.11: Local Singleton when using @ContributesAndroidInjector Dagger 2无法通过贡献AndroidInjector安装模块以获取片段 - Dagger 2 Unable to install module via contributesAndroidInjector for fragment 带有Kotlin的Android Dagger 2.11,贡献了AndroidInjector注释问题 - Android Dagger 2.11 with Kotlin, ContributesAndroidInjector Annotation issue Dagger @ContributesAndroidInjector ComponentProcessor 无法处理这个接口 - Dagger @ContributesAndroidInjector ComponentProcessor was unable to process this interface Dagger2中的工作方法注入方式 - How work method injection in Dagger2 Dagger 迁移到 Hilt,@ContributesAndroidInjector 无法使用带有 @AndroidEntryPoint 注释的片段 - Dagger migration to Hilt, @ContributesAndroidInjector not working with fragment annotaded with @AndroidEntryPoint
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM