Dagger2 - DoubleCheck 中的重复实例

Dagger2 - Duplicate instance in DoubleCheck

我将 Dagger v2.12 与 dagger-android-support 一起使用,配置如下:

应用组件

@Singleton
@Component(
        modules = arrayOf(
                AndroidSupportInjectionModule::class,
                AndroidBindingModule::class,
                AppModule::class
        )
)
interface AppComponent : AndroidInjector<App> {
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>()
}

AndroidBindingModule

@Module
abstract class AndroidBindingModule {
    @PerActivity
    @ContributesAndroidInjector(modules = arrayOf(MainModule::class))
    internal abstract fun contributeMainActivityInjector(): MainActivity
}

主模块

@Module
class MainModule {

    ...

    @Provides @PerActivity
    fun providePresenter(rxLifecycle: ReactiveLifecycle, view: MainView) =
            MainPresenter(rxLifecycle, view)

}

主要活动

class MainActivity : BaseActivity() {
    @Inject
    lateinit var presenter: MainPresenter

    ...
}

分析内存转储,我注意到 MainPresenter class 已创建两次,一次在 MainActivitydagger.internal.DoubleCheck 中被引用(如预期)1, but, there are a second instance referenced only in dagger.internal.DoubleCheck 2.

为什么会这样?这是错误、预期行为还是我的 Dagger 配置中的某些问题?

编辑: 存在问题 https://github.com/ismaeldivita/dagger-test-so

的示例存储库

问题是,您在 activity class 中执行了 AndroidInjection.inject(this) 2 次。发生这种情况是因为您的 activity 是 DaggerAppCompatActivity 的后代,而 DaggerAppCompatActivity 又会执行 AndroidInjection.inject(this).

来自DaggerAppCompatActivitydocs

An AppCompatActivity that injects its members in onCreate(Bundle) and can be used to inject Fragments attached to it.

MainActivity class 中省略 AndroidInjection.inject(this) 行后,您将在 logcat 中获得预期的输出: