dagger 2 viewmodels和ViewModelProvider.Factory

问题描述 投票:0回答:1

最近我遇到了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 

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

android dagger-2 android-viewmodel
1个回答
1
投票

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

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

工厂本身非常轻巧,所以如果它仍然没有被覆盖并且被重新创建,那么应该没有问题。 @Reusable“范围”应该也适用。

© www.soinside.com 2019 - 2024. All rights reserved.