Dagger2 - duplicate instance in DoubleCheck

I am using Dagger v2.12 dagger-android-supportwith the following configuration:

AppComponent

@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
}

Mainmodule

@Module
class MainModule {

    ...

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

}

Mainactivity

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

    ...
}

Analyzing the memory dump, I noticed that the class MainPresenterwas created twice, which was referenced in MainActivityand dagger.internal.DoubleCheck(as expected) 1 , but there is a second instance, indicated only in dagger.internal.DoubleCheck 2 .

sample1

sample2

Why is this happening? Is this a bug, an expected behavior, or some problem in my Dagger configuration?

Edit: An example repository with a problem https://github.com/ismaeldivita/dagger-test-so

+4
source share
1 answer

, AndroidInjection.inject(this) 2 . , DaggerAppCompatActivity, , , AndroidInjection.inject(this).

docs DaggerAppCompatActivity:

An AppCompatActivity, onCreate(Bundle) Fragments, .

AndroidInjection.inject(this) MainActivity logcat:

enter image description here

+3

Source: https://habr.com/ru/post/1688691/


All Articles