LoginSignup
23

More than 3 years have passed since last update.

archのViewModelProvider(s)から卒業するには

Last updated at Posted at 2019-12-10

過去の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

だがしかし
スクリーンショット 2019-12-10 11.30.54.png

deprecatedなのね

かつViewModelProviderを直接使って呼び出せといっています

そのため、archの際に行っていたような
ViewModelProviders.of(this, factory).get ...
のような使い方は推奨されないということですね

引用・参照元
lifecycle ViewModelProviders

androidx.lifecycle.ViewModelProvider

そのため、こちらを使うのがお利口さんということになります

使い方としては直接ViewModelを指定していくので

ViewModelの引数がない場合(AndroidViewModelの場合はapplicationのみの場合)

HogeActivity.kt
private val hogeViewModel :HogeViewModel by lazy { ViewModelProvider.NewInstanceFactory().create(HogeViewModel::class.java) }

という形で呼び出すことができます

引数ありの場合

ただ、たいていViewModelに引数があるのでその場合は継承した独自のFactoryクラスを作ることになります
※今回はrepositoryがコンストラクタにあることを想定しています、何でも良いです あくまで一例

HogeFactory.kt
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を導入すると

build.gradle
def ktx_version = "1.1.0"
// fragment-ktx
implementation "androidx.fragment:fragment-ktx:$ktx_version"

このような書き方で済みます

HogeActivity.kt
private val hogeViewModel: HogeViewModel by viewModels { HogeFactory(repo) }

引用・参照元
lifecycle ViewModelProvider

まとめ

  • archからlifecycleのViewModelProvider(s)へ移行しよう
  • lifecycleのViewModelProvidersはdeprecated

間違い点や他にもやり方がある場合はご教授ください🙏🙏🙏

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23