Search code examples
androidkotlinmvvmviewmodel

Pass multi parameters to ViewModel Primary Constructor


I used this link for pass parameter to ViewModel constructor when pass one parameter no problem

class ViewModelFactory<T>(val creator: () -> T) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return creator() as T
   }
}

inline fun <reified T : ViewModel> Fragment.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
    ViewModelProviders.of(this).get(T::class.java)
else
    ViewModelProviders.of(this, ViewModelFactory(creator)).get(T::class.java)
}

inline fun <reified T : ViewModel> FragmentActivity.getViewModel(noinline creator: (() -> T)? = null): 
T {
return if (creator == null)
    ViewModelProviders.of(this).get(T::class.java)
else
    ViewModelProviders.of(this, ViewModelFactory(creator)).get(T::class.java)
}

but i do not know how to can pass multi parameters to Constructor and return it with above code. can you help me?


Solution

  • Your getViewModel function get lambda, that produces ViewModel, as parameter. And in this case, you could do something like this:

    val param1 = ...
    val param2 = ...
    val param3 = ...
    getViewModel {
       YourViewModel(param1, param2, param3...)
    }
    

    Lambda passed to getViewModel capture all params. And later you invoke this lambda at ViewModelFactory and create ViewModel:

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return creator() as T
    }