【发布时间】:2019-07-24 12:19:30
【问题描述】:
最近我遇到了 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只有活动的ViewModels,它没有添加最后一个ViewModel。 但是,如果 @Module(includes = [ActividadesFragmentModule.ViewModule::class]) 在 ActivityBuilder 中完成,它确实可以完美运行
@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class MainActivityBuilder
有人知道我做错了什么吗?
【问题讨论】:
-
我认为您需要从
ViewModelProvider.Factory中删除范围 -
它确实有效,但这是什么意思?我每次都会创建一个新的 ViewModelProvider.Factory 吗?通常我一直用它作为单例
标签: android dagger-2 android-viewmodel