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の追加

Core KTX

dependencies {
    implementation "androidx.core:core-ktx:1.6.0"
}

Fragment KTX

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02"
}

viewModels

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