簡體   English   中英

Dagger 2注入不適用於@ContributesAndroidInjector

[英]Dagger 2 injection not work with @ContributesAndroidInjector

我的活動綁定有以下模塊:

@Module
abstract class ActivityBuilder {

    @ActivityScope
    @ContributesAndroidInjector(modules = [BaseActivityModule::class])
    abstract fun bindsActivity(): BaseActivity

    @ActivityScope
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    abstract fun bindMainActivity(): MainActivity

}

BaseActivityModule

@Module
abstract class BaseActivityModule {

    @Binds
    @ActivityScope
    abstract fun provideProgressDialogManager(manager: ProgressDialogManager): ProgressManager

}

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())
    }

我的組件:

@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

    }

}

但是如果我這樣做:

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

}

我有這個構建錯誤:

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:公共抽象接口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在以下位置注入:
dagger.android.AndroidInjector.inject(arg0)e:組件中存在帶有匹配鍵的綁定:br.com.rede.acelera.module.ActivityBuilder_BindsActivity.BaseActivitySubcomponent e:java.lang.IllegalStateException:無法分析:org.jetbrains。 kotlin.kapt3.diagnostic.KaptError:批注處理時出錯

知道為什么嗎?

即使您的AndroidInjection.inject(this)在基類中(或從DaggerAppCompatActivity擴展而來),Dagger AndroidInjection.inject(this)從子類中注入依賴DaggerAppCompatActivity

然后,它在ActivityBuilder查找子類定義。

因此,要注入抽象基類,您需要在其每個子類中提供該依賴項(通過ActivityBuilder中的Module)。

@Module
abstract class ActivityBuilder {

    @ActivityScope
    @ContributesAndroidInjector(modules = [MainActivityModule::class, BaseActivityModule::class])
    abstract fun bindMainActivity(): MainActivity

}

請嘗試使用此BaseActivityModule,然后從ProgressDialogManager構造函數中刪除@Inject批注。

@Module
class BaseActivityModule {

    @Provide
    @ActivityScope
    fun provideProgressDialogManager(activity: BaseActivity): ProgressManager {
       return ProgressDialogManager(activity)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM