在我的应用程序中,我有一个具有应用程序范围的组件(与 Singleton 相同),它提供 ViewModel Factory,以及一个具有 Activity 范围的依赖组件,它将工厂注入(inject)到 fragment 中。
应用程序组件定义如下:
@Component(modules = [AppModule::class, /* other stuff */, ViewModelModule::class])
@ApplicationScope
interface AppComponent {
fun inject(app: Application)
/* other stuff */
val viewModelFactory: ViewModelFactory
}
View 模型模块定义如下:
@ApplicationScope
@Module
abstract class ViewModelModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(DisplayEntryViewModelImpl::class)
abstract fun bindDisplayEntryViewModel(displayEntryViewModelImpl: DisplayEntryViewModelImpl): ViewModel
}
Activity 范围组件定义如下:
@Component(dependencies = [AppComponent::class], modules = [DisplayEntryActivityModule::class])
@ActivityScope
interface DisplayEntryActivityComponent {
fun inject(displayEntryActivity: DisplayEntryActivity)
fun inject(displayEntryFragment: DisplayEntryFragment)
}
当我尝试在 fragment 中注入(inject) View 模型工厂时,出现此错误:
error: android.arch.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides- or @Produces-annotated method.
如果我更新 Activity 组件以包含 View 模型模块,如下所示
@Component(dependencies = [AppComponent::class], modules = [DisplayEntryActivityModule::class, ViewModelModule::class])
@ActivityScope
interface DisplayEntryActivityComponent {
fun inject(displayEntryActivity: DisplayEntryActivity)
fun inject(displayEntryFragment: DisplayEntryFragment)
}
然后编译。我的理解是,如果父组件显式提供这些成员,则依赖组件可以访问父组件中注入(inject)的成员,就像我在这里所做的那样
val viewModelFactory: ViewModelFactory
那么为什么我仍然需要在 Activity 范围组件中提供 viewmodel 模块?
最佳答案
当使用依赖项时,dagger 将使用该组件来注入(inject)成员。
父组件必须显式声明可以在子组件中使用的对象。
@Component(modules = [AppModule::class, /* other stuff */, ViewModelModule::class])
@ApplicationScope
interface AppComponent {
fun inject(app: Application)
fun viewModelFactory(): ViewModelProvider.Factory
fun viewModel(): ViewModel
}
关于android - Dagger2 依赖组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998993/