在我的应用程序中,我有一个带有应用程序范围的组件(与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模块?
答案 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
}