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 已创建两次,一次在 MainActivity
和 dagger.internal.DoubleCheck
中被引用(如预期)1, but, there are a second instance referenced only in dagger.internal.DoubleCheck
2.
为什么会这样?这是错误、预期行为还是我的 Dagger 配置中的某些问题?
的示例存储库
问题是,您在 activity class 中执行了 AndroidInjection.inject(this)
2 次。发生这种情况是因为您的 activity 是 DaggerAppCompatActivity
的后代,而 DaggerAppCompatActivity
又会执行 AndroidInjection.inject(this)
.
来自DaggerAppCompatActivity
的docs:
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 中获得预期的输出:
我将 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 已创建两次,一次在 MainActivity
和 dagger.internal.DoubleCheck
中被引用(如预期)1, but, there are a second instance referenced only in dagger.internal.DoubleCheck
2.
为什么会这样?这是错误、预期行为还是我的 Dagger 配置中的某些问题?
的示例存储库问题是,您在 activity class 中执行了 AndroidInjection.inject(this)
2 次。发生这种情况是因为您的 activity 是 DaggerAppCompatActivity
的后代,而 DaggerAppCompatActivity
又会执行 AndroidInjection.inject(this)
.
来自DaggerAppCompatActivity
的docs:
An
AppCompatActivity
that injects its members inonCreate(Bundle)
and can be used to injectFragments
attached to it.
从 MainActivity
class 中省略 AndroidInjection.inject(this)
行后,您将在 logcat 中获得预期的输出: