ViewModelの生成と初期化方法
ViewModel
import androidx.lifecycle.ViewModel class UserViewModel(name: String, age: Int, gender: Int) : ViewModel() { val name = name val age = age val gender = gender }
ViewModelProviderを使う
val viewModel = ViewModelProvider(this, object : ViewModelProvider.NewInstanceFactory() { override fun <T : ViewModel?> create(modelClass: Class<T>): T { return UserViewModel("Tanaka", 27, 1) as T } }).get(UserViewModel::class.java) Log.d("MainActivity", "${viewModel.name}, ${viewModel.age}, ${viewModel.gender}")
Android KTXを使う
Android KTXでは、Delegated propertiesを使って、ViewModelの生成と初期化、またActivityのViewModelの共有を行うことが出来る。
dependencyの追加
dependencies { implementation "androidx.core:core-ktx:1.6.0" }
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02" }
viewModels
val viewModel: UserViewModel by viewModels<UserViewModel>() { object : ViewModelProvider.NewInstanceFactory() { override fun <T : ViewModel?> create(modelClass: Class<T>): T { return UserViewModel("Tanaka", 27, 1) as T } } }
参照
ViewModelProvider
https://developer.android.com/reference/android/arch/lifecycle/ViewModelProvider#viewmodelprovider_2
Android KTX
https://developer.android.com/kotlin/ktx
How to instantiate ViewModel in AndroidX
https://stackoverflow.com/questions/54313453/how-to-instantiate-viewmodel-in-androidx