Dagger2依赖组件

时间:2017-12-27 21:43:23

标签: android kotlin dagger-2

在我的应用程序中,我有一个带有应用程序范围的组件(与Singleton相同),它提供了一个ViewModel Factory,以及一个具有Activity范围的依赖组件,它将工厂注入片段。

应用程序组件定义如下:

@Component(modules = [AppModule::class, /* other stuff */, ViewModelModule::class])

@ApplicationScope
interface AppComponent {
    fun inject(app: Application)

    /* other stuff */

    val viewModelFactory: ViewModelFactory
}

视图模型模块定义如下:

@ApplicationScope
@Module
abstract class ViewModelModule {
    @Binds
    abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(DisplayEntryViewModelImpl::class)
    abstract fun bindDisplayEntryViewModel(displayEntryViewModelImpl: DisplayEntryViewModelImpl): ViewModel
}

活动范围组件定义如下:

@Component(dependencies = [AppComponent::class], modules = [DisplayEntryActivityModule::class])

@ActivityScope
interface DisplayEntryActivityComponent {
    fun inject(displayEntryActivity: DisplayEntryActivity)
    fun inject(displayEntryFragment: DisplayEntryFragment)
}

当我尝试在片段中注入viewmodel工厂时,我收到此错误:

error: android.arch.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides- or @Produces-annotated method.

如果我更新活动组件以包含视图模型模块,就像这样

@Component(dependencies = [AppComponent::class], modules = [DisplayEntryActivityModule::class, ViewModelModule::class])

@ActivityScope
interface DisplayEntryActivityComponent {
    fun inject(displayEntryActivity: DisplayEntryActivity)
    fun inject(displayEntryFragment: DisplayEntryFragment)
}

然后编译。我的理解是,如果父组件显式提供这些成员,依赖组件可以访问父组件中注入的成员,就像我在这里用

一样
 val viewModelFactory: ViewModelFactory

那么为什么我仍然需要在activity scope组件中提供viewmodel模块?

1 个答案:

答案 0 :(得分:1)

使用依赖项时,dagger将使用该组件注入成员 父组件必须显式声明可以在子组件中使用的对象。

@Component(modules = [AppModule::class, /* other stuff */, ViewModelModule::class])
@ApplicationScope  
interface AppComponent {
   fun inject(app: Application)

   fun viewModelFactory(): ViewModelProvider.Factory

   fun viewModel(): ViewModel
}

你可以看看这篇文章: https://proandroiddev.com/dagger-2-part-ii-custom-scopes-component-dependencies-subcomponents-697c1fa1cfc