android - Dagger2 依赖组件

标签 android kotlin dagger-2

在我的应用程序中,我有一个具有应用程序范围的组件(与 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
}

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

关于android - Dagger2 依赖组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998993/

相关文章:

java - Dagger 2 如何解决构造函数依赖

安卓 2.2 : best way to read small blocks of binary data from big files?

android - 如何将自定义壁纸放到 Android 市场上?

java - Kotlin:公共(public) getter 返回不可变列表,但私有(private) getter 应该返回可变列表

android - 在Android中使用 “prominent top app bar”滚动的应用程序中延迟的滚动行为

android - Dagger 2 : inject after define subcomponent

java - Android中如何让6个按钮调用不同参数的同一个方法?

java - 启动相机导致 Android 崩溃

java - 聊天应用程序网络客户端

android - 我应该在 BindAdapter 类中使用 inject 吗?