匕首2 viewmodels和ViewModelProvider.Factory

时间:2019-02-25 15:32:56

标签: android dagger-2 android-viewmodel

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

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

一些代码:

@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
            }
        }
    } 
}

活动生成器

@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 仅具有活动的ViewModel,它不添加最后一个ViewModel。 但是,如果在 ActivityBuilder 中完成了 @Module(includes = [ActividadesFragmentModule.ViewModule :: class]),它确实可以正常工作

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

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

1 个答案:

答案 0 :(得分:1)

您需要从您的ViewModelProvider.Factory删除范围

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

工厂本身非常轻巧,因此如果它不受限制并可以重新创建,应该没有任何问题。 @Reusable“范围”也应该起作用。