過去のrepositoryでarchのViewModelProvider(s)がdeprecatedになっていることに気づいたのでどうしたものかと思い、備忘録も兼ねてまとめることにする
archのViewModelProvider(s)はもうメンテされないYO
The android.arch Architecture Components packages are no longer maintained. They have been superseded by the corresponding androidx.* packages. See androidx.lifecycle.ViewModelProviders instead.
引用元
arch ViewModelProvider
arch ViewModelProviders
乗り換えるなら
androidx.lifecycle.ViewModelProvider(s)
によろしくということですね
androidx.lifecycle.ViewModelProviders
deprecatedなのね
かつViewModelProviderを直接使って呼び出せといっています
そのため、archの際に行っていたような
ViewModelProviders.of(this, factory).get ...
のような使い方は推奨されないということですね
引用・参照元
lifecycle ViewModelProviders
androidx.lifecycle.ViewModelProvider
そのため、こちらを使うのがお利口さんということになります
使い方としては直接ViewModelを指定していくので
ViewModelの引数がない場合(AndroidViewModelの場合はapplicationのみの場合)
private val hogeViewModel :HogeViewModel by lazy { ViewModelProvider.NewInstanceFactory().create(HogeViewModel::class.java) }
という形で呼び出すことができます
引数ありの場合
ただ、たいていViewModelに引数があるのでその場合は継承した独自のFactoryクラスを作ることになります
※今回はrepositoryがコンストラクタにあることを想定しています、何でも良いです あくまで一例
class HogeFactory(private val repo: HogeRepository) :
ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return HogeViewModel(repo) as T
}
}
そして呼び出します
private val hogeViewModel: HogeViewModel by lazy { ViewModelProvider(this, HogeFactory(repo)).get(HogeViewModel::class.java) }
もしくは長いなと思う場合は、activity-ktx
, fragment-ktx
を導入すると
def ktx_version = "1.1.0"
// fragment-ktx
implementation "androidx.fragment:fragment-ktx:$ktx_version"
このような書き方で済みます
private val hogeViewModel: HogeViewModel by viewModels { HogeFactory(repo) }
引用・参照元
lifecycle ViewModelProvider
まとめ
- archからlifecycleのViewModelProvider(s)へ移行しよう
- lifecycleのViewModelProvidersはdeprecated
間違い点や他にもやり方がある場合はご教授ください🙏🙏🙏