[Android]ViewModelのコンストラクタに引数を渡す

コンストラクタを作って渡せばいいじゃん?

そう思ってたんです。

出来なかったんです。

ViewModelのインスタンスの生成って基本的に以下だと思ってて、、、

// ViewModel生成
val viewModel = ViewModelProviders.of(this).get(TopViewModel::class.java)

コンストラクタにわたす余地なくね?ってなったわけです。

ってことで、コンストラクタに引数を渡す方法!

ViewModelのファクトリー作ってファクトリーに引数を渡してあげる!

スポンサーリンク

実装

Factoryを作成

// リストのViewModel
class ListViewModel(val status: Int, val list: List<String>) : BaseViewModel() {

    class Factory constructor(
        private val status: Int, private val list: List<String>
    ) : ViewModelProvider.Factory {
        @Suppress("UNCHECKED_CAST")
        override fun <T : ViewModel?> create(modelClass: Class<T>): T =
            ListViewModel(status, list) as T
    }
}

自分はViewModelの中に作っちゃいました。これが正解かどうかはわからない。

Factoryに欲しい引数のコンストラクタ作って、createでViewModelを生成して上げる感じ。

ViewModelを生成する

// ViewModel取得
val viewModel = ViewModelProviders.of(this, ListViewModel.Factory(status, list)).get(ListViewModel::class.java)

これで実質ViewModelのコンストラクタに引数を渡せることに!

タイトルとURLをコピーしました