最近我遇到了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(包含= [ActividadesFragmentModule.ViewModule :: class])在ActivityBuilder中完成,它确实可以正常运行
@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class MainActivityBuilder
有人知道我做错了什么吗?
您需要从ViewModelProvider.Factory
中删除范围
@Singleton
永远不会从您的活动或片段范围获得任何东西。通过删除范围,您可以在每个组件中创建一个新工厂 - 它可以收集您在这些较低范围中添加的其他绑定。
工厂本身非常轻巧,所以如果它仍然没有被覆盖并且被重新创建,那么应该没有问题。 @Reusable
“范围”应该也适用。