〈kotlin〉コンストラクタ引数のあるViewModelの作り方

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

Android Room とビュー - Kotlin  |  Android デベロッパー  |  Android Developers
このcodelabでコンストラクタ引数としてrepositoryを持つViewModelが出てきた。

引数なしViewModel

引数を何も待たない場合は以下のように定義していた。

class SampleViewModel : ViewModel(){
...
}
class SampleActivity : AppCompatActivity(){
    private val viewModel : SampleViewModel  by viewModels() 
    ...
}

引数ありViewModel

今回のようにrepositoryなどのコンストラクタ引数を持たせる場合、
渡した引数との依存関係を取得するためにはViewModelProvider.Factoryを使用して定義する必要がある。
ViewModelProvider.FactoryはViewModelをインスタンス化するためのインターフェース。

class SampleViewModelFactory(private val repository: SampleRepository) : ViewModelProvider.Factory{
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if(modelClass.isAssignableFrom(SampleViewModel::class.java)){
            @Suppress("UNCHECKED_CAST")
            return SampleViewModel(repository) as T
        }
        throw (IllegalArgumentException("Unknown ViewModel Class"))
    }
}
class SampleActivity : AppCompatActivity(){
    private val viewModel : SampleViewModel  by viewModels{
        SampleViewModelFactory(repository)
        //repositoryはApplicationクラスなどで定義しておく
    } 
    ...
}