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?
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
}