Android Dagger2依赖成分

Android Dagger2依赖成分,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,在我的应用程序中,我有一个具有应用范围的组件(与Singleton相同),它提供了一个ViewModel工厂,还有一个具有活动范围的依赖组件,它将工厂注入到片段中 应用程序组件的定义如下: @Component(modules = [AppModule::class, /* other stuff */, ViewModelModule::class]) @ApplicationScope interface AppComponent { fun inject(app: Applica

在我的应用程序中,我有一个具有应用范围的组件(与Singleton相同),它提供了一个ViewModel工厂,还有一个具有活动范围的依赖组件,它将工厂注入到片段中

应用程序组件的定义如下:

@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)
}
视图模型模块定义如下:

@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)
}
活动范围组件的定义如下:

@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

那么为什么我仍然需要在活动范围组件中提供viewmodel模块呢?

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

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

   fun viewModelFactory(): ViewModelProvider.Factory

   fun viewModel(): ViewModel
}
您可以看看这篇文章:

这没什么区别。很抱歉,我返回了错误类型的注入成员。试试这个怎么样?谢谢,这个管用。您是否介意更新您的答案,并简要解释为什么需要这样声明此特定依赖项,或者提供相关信息的链接?