简体   繁体   English

匕首2 viewmodels和ViewModelProvider.Factory

[英]dagger 2 viewmodels and ViewModelProvider.Factory

Recently I had problems with a ViewModelProvider.Factory due to it was not loading all ViewModels of the project. 最近,由于没有加载项目的所有ViewModel,我对ViewModelProvider.Factory遇到了问题。

I have Activities and fragments. 我有活动和片段。 The activity ones are loaded without any problem, however I've tried to encapsulate FragmentViewModels inside the module where I'm creating the Fragment. 活动的加载没有任何问题,但是我试图将FragmentViewModels封装在我创建Fragment的模块中。

a bit of code: 一点代码:

@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 Builder 活动生成器

@Module
abstract class MainActivityBuilder {
....

@ActivityScope
@ContributesAndroidInjector(modules [XXXFragmentModule::class])
abstract fun bindBottomNavigationActivity(): BottomNavigationActivity

} }

so this is the XXXFragmentModule 所以这是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
    }
}

this does not work, the viewModels of the first block of code does only have the ViewModels of the activities, it does not add this last ViewModel. 行不通 ,第一个代码块的viewModels仅具有活动的ViewModels,它不添加最后一个ViewModel。 However if the @Module(includes = [ActividadesFragmentModule.ViewModule::class]) is done in ActivityBuilder it does work perfeclty 但是,如果在ActivityBuilder中完成@Module(includes = [ActividadesFragmentModule.ViewModule :: class]) ,它确实可以正常运行

@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class MainActivityBuilder 

does someone know what I am doing wrong? 有人知道我在做什么错吗?

You need to remove the scope from your ViewModelProvider.Factory 您需要从ViewModelProvider.Factory删除范围

@Singleton will never ever get anything from your Activity or Fragment scope. @Singleton永远不会从您的Activity或Fragment范围获得任何东西。 By removing the scope you create a new factory within every component—where it can collect the additional bindings that you added in those lower scopes. 通过删除范围,您可以在每个组件中创建一个新工厂,该工厂可以收集在这些较低范围中添加的其他绑定。

The factory itself is pretty lightweight so there should be no issues if it remains unscoped and gets recreated. 工厂本身是非常轻便的,因此如果它不受限制并可以重新创建,应该没有任何问题。 @Reusable "scope" should work as well. @Reusable “作用域”也应该起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Dagger 2 ViewModelProvider.Factory绑定多次 - Dagger 2 ViewModelProvider.Factory bound multiple times 使用Android上的Dagger和Java,ViewModelProvider.Factory在片段上保持为空 - ViewModelProvider.Factory remains null on fragment using Dagger and Java on Android Dagger2,在依赖组件中为 ViewModelProvider.Factory 添加绑定 - Dagger2, adding a binding for ViewModelProvider.Factory in a dependant component 使用匕首将 ViewModelProvider.Factory 注入不同的 Activity - Inject ViewModelProvider.Factory to different Activity using dagger 为什么在ViewModelProvider.Factory实现中添加@Singleton批注会导致编译错误[Dagger / MissingBinding]? - Why adding @Singleton annotation to ViewModelProvider.Factory implementation causes a compile error [Dagger/MissingBinding]? 将ViewModelProvider.Factory的提供程序注入espresso测试 - Inject provider of ViewModelProvider.Factory into esspresso test 如何将 ViewModelProvider.Factory 注入片段 - How to inject ViewModelProvider.Factory into a fragment ViewModelProvider.Factory 总是返回一个视图模型 - ViewModelProvider.Factory always return one viewmodel 获取ViewModel ViewModelProvider.Factory和应用程序上下文 - Get ViewModel ViewModelProvider.Factory and Application Context ViewModelProvider.Factory 和 ViewModelProvider.NewInstanceFactory 有什么区别? - What are the differences between ViewModelProvider.Factory and ViewModelProvider.NewInstanceFactory?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM