最近,我在 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
有人知道我在做什么错吗?
答案 0 :(得分:1)
您需要从您的ViewModelProvider.Factory
删除范围
@Singleton
永远不会从Activity或Fragment范围中获得任何东西。通过删除范围,您可以在每个组件中创建一个新工厂,该工厂可以收集在这些较低范围中添加的其他绑定。
工厂本身非常轻巧,因此如果它不受限制并可以重新创建,应该没有任何问题。 @Reusable
“范围”也应该起作用。