【问题标题】:How can I use constructor injection for ViewModel with Dagger2 android?如何使用带有 Dagger2 android 的 ViewModel 的构造函数注入?
【发布时间】:2020-08-17 02:45:00
【问题描述】:

我想将 ViewModel 与 Dagger2 一起使用,但我不知道如何将构造函数注入与 ViewModelProviders 或 ViewModelProvider.Factory 一起使用

如何将 ViewModel 与构造函数注入一起使用?我应该使用 ViewModelProvider.Factory 还是 ViewModelProviders?

更新: 您可以在this link中找到解决方案的详细信息

【问题讨论】:

    标签: android-studio mvvm dependency-injection dagger android-viewmodel


    【解决方案1】:

    您可以创建自己的自定义类扩展 ViewModelProvider.Factory

    class ViewModelFactory @Inject constructor(
    private val providers: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
    ) : ViewModelProvider.Factory {
    
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        var provider = providers[modelClass]
        if (provider == null) {
            for ((key, value) in providers) {
                if (modelClass.isAssignableFrom(key)) {
                    provider = value
                    break
                }
            }
        }
        if (provider == null) {
            throw IllegalStateException("unknown model class $modelClass")
        }
    
        return provider.get() as T
      }
    }
    

    为这个类创建模块并将模块注入你的ApplicationComponent

    @Module
    abstract class ViewModelFactoryModule {
       @Binds
       abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
    }
    

    然后在你的片段中注入这个工厂

    @Inject
    lateinit var factory: ViewModelProvider.Factory
    

    并像这样初始化您的 viewModel

    val vm: YourViewModel by viewModels { factory }
    

    【讨论】:

    • 我只想为我项目中的所有 ViewModel 使用一个工厂。但是在使用 ViewModelProvider.Factory 时,我们可以只使用特定的构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多