Dagger2-DoubleCheck中的重复实例

Ism*_*ita 5 android kotlin dagger dagger-2

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

AppComponent

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

AndroidBindingModule

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

主模块

@Module
class MainModule {

    ...

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

}
Run Code Online (Sandbox Code Playgroud)

主要活动

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

在分析内存转储时,我注意到MainPresenter该类已经创建了两次,其中一个在MainActivitydagger.internal.DoubleCheck(如预期的那样)1中被引用,但是,第二个实例仅在dagger.internal.DoubleCheck 2中被引用。

样本1

样本2

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

编辑:带有问题的样本库https://github.com/ismaeldivita/dagger-test-so

azi*_*ian 5

问题是,您AndroidInjection.inject(this)在活动课程中执行了2 次。会发生这种情况,因为您的活动是 的后代DaggerAppCompatActivity,而后者也执行AndroidInjection.inject(this)

文档DaggerAppCompatActivity

一个AppCompatActivity该注入其成员中onCreate(Bundle),并且可以用于注入Fragments连接到它。

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

在此处输入图片说明