3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ViewModelProviders is deprecated になっているので、ViewModelProviderを使う

Posted at

ViewModelProviders が非推奨になっている

Android Developer 公式: ViewModelに書いてある
ViewModelProviders.of(this).get(UserModel.class)
をつかうと deprecated(非推奨) と表示されてしまう。
公式のViewModelProvidersの説明によるともうメンテナンスがされないらしい。
今後は ViewModelProvider を使わないといけないらしいので今回はその使い方を紹介する。

#用意するファイル

Activity

プロジェクト開始時に通常通り生成されるもの
解説は省く

ViewModel

MVVM アーキテクチャで View と Model をつなぐもの。メリットとしては下記の2つが考えられる。
・画面回転時に View に持たせていたデータが消えるのを防ぐ
・疎結合にしてくれるので Activity が太るのを防ぐ

Factory

ViewModel を Activity で呼ぶ際に使うクラス。
Factory クラスでインスタンスの作り方を管理して、Activity でクラスを呼び出す際にで具体的な処理を行っている。

使い方

以下のコードの通りに使うことができます。
ViewModelに設定した文字が Activity から呼び出されるだけのコードです。

MainActivity

package com.example.viewmodel_fragment

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {

    lateinit var factory: MainViewModelFactory
    lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        factory =  MainViewModelFactory()
        viewModel = ViewModelProvider(this, factory).get(MainViewModel::class.java)

        viewModel.loadData()

        viewModel.user.observe(this, Observer {
            println(it)
        })

    }
}

MainViewModel
package com.example.viewmodel_fragment

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel(){

    val user: MutableLiveData<String> = MutableLiveData()

    fun loadData(){
        user.postValue("higu")
    }
}

MainViewModelFactory
package com.example.viewmodel_fragment

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

class MainViewModelFactory : ViewModelProvider.NewInstanceFactory(){
        override fun <T : ViewModel?> create(modelClass: Class<T>):T {
            return MainViewModel() as T
        }
}

Factory に関して補足をすると T というのはジェネリクスといい、メソッドやクラスに型を
つけることができる機能です。

3
3
1

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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?