【问题标题】:dagger 2 viewmodels and ViewModelProvider.Factory匕首 2 视图模型和 ViewModelProvider.Factory
【发布时间】:2019-07-24 12:19:30
【问题描述】:

最近我遇到了 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(includes = [ActividadesFragmentModule.ViewModule::class])ActivityBuilder 中完成,它确实可以完美运行

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

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

【问题讨论】:

  • 我认为您需要从 ViewModelProvider.Factory 中删除范围
  • 它确实有效,但这是什么意思?我每次都会创建一个新的 ViewModelProvider.Factory 吗?通常我一直用它作为单例

标签: android dagger-2 android-viewmodel


【解决方案1】:

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

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

工厂本身是非常轻量级的,所以如果它保持无范围并重新创建应该没有问题。 @Reusable“范围”应该也可以。

【讨论】:

  • 我已经这样做了,它有效。每次调用此提供程序时,我还添加了一个断点,它会增加元素的数量,因此它从两个视图模型开始,然后是三个,然后是四个……这是什么意思?它将重用视图模型?
  • @JoseMLechon @Reuseable 类似于作用域,不保证唯一性。它缓存要重用的对象,而不是每次都重新创建。
  • 感谢您的回答,我对此有点困惑。
猜你喜欢
  • 2020-10-02
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多