〈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クラスなどで定義しておく } ... }