Dagger 2 视图模型和 ViewModelProvider.Factory

dagger 2 viewmodels and ViewModelProvider.Factory

最近我遇到了 ViewModelProvider.Factory 的问题,因为它没有加载项目的所有 ViewModel。

我有活动和片段。 activity 的加载没有任何问题,但是我试图将 FragmentViewModels 封装在我创建片段的模块中。

一些代码:

@Module(includes = [
  ... ,... ,...
])
class UIModule {

    @Singleton
    @Provides
    fun provideViewModelFactory(viewModels: MutableMap<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>)
        : ViewModelProvider.Factory {

        return object : ViewModelProvider.Factory {

            override fun <T : ViewModel> create(modelClass: Class<T>): T {
                return requireNotNull(viewModels[modelClass]).get() as T
            }
        }
    } 
}

Activity 生成器

@Module
abstract class MainActivityBuilder {
....

@ActivityScope
@ContributesAndroidInjector(modules [XXXFragmentModule::class])
abstract fun bindBottomNavigationActivity(): BottomNavigationActivity

}

所以这是 XXXFragmentModule

@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class ActividadesFragmentModule {

  ....

    @ContributesAndroidInjector
    internal abstract fun contributeSuggestedFragment(): SuggestedFragment


    @Module
    abstract class ViewModule {

        @Binds
        @IntoMap
        @ViewModelKey(SuggestedViewModel::class)
        internal abstract fun bindSuggestedViewModel(viewModel: SuggestedViewModel): ViewModel
    }
}

这不起作用,第一个代码块的 viewModels 确实只有活动的 ViewModels,它没有添加最后一个 ViewModel。 但是,如果 @Module(includes = [ActividadesFragmentModule.ViewModule::class])ActivityBuilder[=35 中完成=] 它确实工作得很好

@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class MainActivityBuilder 

有人知道我做错了什么吗?

您需要从 ViewModelProvider.Factory

中删除范围

@Singleton 永远不会从您的 Activity 或 Fragment 范围中得到任何东西。通过删除作用域,您可以在每个组件中创建一个新工厂——它可以在其中收集您在那些较低作用域中添加的附加绑定。

工厂本身非常轻量级,因此如果它保持未定义范围并重新创建应该没有问题。 @Reusable "scope" 应该也可以。