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" 应该也可以。
最近我遇到了 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" 应该也可以。