【问题标题】:Is it possible to create a basic constructor with T-parameters for ViewModelProvider.Factory?是否可以为 ViewModelProvider.Factory 创建一个带有 T 参数的基本构造函数?
【发布时间】:2020-05-12 18:07:11
【问题描述】:

我需要你的帮助...如果我有许多带有构造函数的 ViewModel(具有不同的参数 - 一些存储库) - 那么事实证明应该有尽可能多的自定义 ViewModelProvider.Factories?那么这会使代码的编写加倍。类似于例如:

 //1st ViewModel

 OneViewModel1(val repos: OneRepository) : ViewModel() {
 }

//1st Factory
 class OneFactory(private val repository: OneRepository):ViewModelProvider.Factory{
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return if (modelClass.isAssignableFrom(OneViewModel::class.java)) OneViewModel(repository) as T else {
            throw IllegalArgumentException("ViewModel Not Found")
        }
    }

}


  //2d OneViewModel

 TwoViewModel(val repository: TwoRepository) : ViewModel() {
 }

//1st Factory
 class TwoFactory(private val repository: TwoRepository):ViewModelProvider.Factory{
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return if (modelClass.isAssignableFrom(TwoViewModel::class.java)) TwoViewModel(repository) as T else {
            throw IllegalArgumentException("ViewModel Not Found")
        }
    }

}

等等……

如果我有 100 个 ViewModel,我需要创建 100 个工厂。还有其他方法吗??

【问题讨论】:

  • @user 需要一个工厂才能为特定模型传递某些参数,不是吗?
  • @user 我正在尝试找出答案......

标签: android kotlin viewmodel android-viewmodel viewmodelproviders


【解决方案1】:

您不必创建具有不同参数(不同存储库)的工厂类。您可以只创建一个具有多个参数(存储库)的 ViewModelFactory 类。在你的情况下:

class ViewModelFactory(private val repositoryOne: OneRepository, private val repositoryTwo: TwoRepository): ViewModelProvider.Factory {
  override fun <T : ViewModel?> create(modelClass: Class<T>): T {
     return when {
       modelClass.isAssignableFrom(OneViewModel::class.java) -> OneViewModel(repositoryOne) as T
       modelClass.isAssignableFrom(TwoViewModel::class.java) -> TwoViewModel(repositoryTwo) as T
       else -> IllegalArgumentException("ViewModel Not Found") 
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-21
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多