【问题标题】:Dagger 2 injection not work with @ContributesAndroidInjectorDagger 2 注入不适用于@ContributesAndroidInjector
【发布时间】:2018-01-25 20:26:31
【问题描述】:

我有这个模块用于我的活动绑定:

@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.AndroidInjector.inject(T)] br.com.rede.acelera.util.ProgressManager 如果没有 @Provides- 或 @Produces- 注释方法。 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 在 e:
注入 dagger.android.AndroidInjector.inject(arg0) e: 绑定 组件中存在匹配键: br.com.rede.acelera.module.ActivityBuilder_BindsActivity.BaseActivitySubcomponent e: java.lang.IllegalStateException: 分析失败: org.jetbrains.kotlin.kapt3.diagnostic.KaptError:出错时 注释处理

知道为什么吗?

【问题讨论】:

    标签: android dagger


    【解决方案1】:

    Dagger 开始从子类注入依赖项,即使您的 AndroidInjection.inject(this) 在您的基类中(或者您从 DaggerAppCompatActivity 扩展)。

    然后它会在您的ActivityBuilder 中查找子类定义。

    因此,要注入抽象基类,您需要在它的每个子类中提供该依赖项(通过 ActivityBuilder 中的模块)。

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

    【讨论】:

      【解决方案2】:

      尝试使用此 BaseActivityModule,并从 ProgressDialogManager 构造函数中删除 @Inject 注解。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-30
        • 2019-07-04
        相关资源
        最近更新 更多