简体   繁体   中英

Is it possible to create a basic constructor with T-parameters for ViewModelProvider.Factory?

I need your help...if I have many ViewModels with constructors(with different parameters - some repositories) - then it turns out there should be as many custom ViewModelProvider.Factories?then this doubles the writing of code.Something like that for example:

 //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")
        }
    }

}

and so forth.....

if i have 100 ViewModels i need to create 100 Factories..Is there another way??

You don't have to create a Factory class with a different parameter (different repository). You could create just one ViewModelFactory class that have more than one parameter (repository). In your case:

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") 
    }
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM