Android Dagger2依赖成分
在我的应用程序中,我有一个具有应用范围的组件(与Singleton相同),它提供了一个ViewModel工厂,还有一个具有活动范围的依赖组件,它将工厂注入到片段中 应用程序组件的定义如下: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
@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
}
您可以看看这篇文章:
这没什么区别。很抱歉,我返回了错误类型的注入成员。试试这个怎么样?谢谢,这个管用。您是否介意更新您的答案,并简要解释为什么需要这样声明此特定依赖项,或者提供相关信息的链接?