11
6

More than 1 year has passed since last update.

ViewModelにLiveDataとMutableLiveDataを同時に宣言しなくていいようにする

Last updated at Posted at 2020-02-26

MainViewModelからMutableLiveDataのみを扱い、LiveDataの宣言をしなくていいようにします。

変更前のコード

class MainViewModel() : ViewModel() {
    private val _param = MutableLiveData<MainViewParam>()
    val param: LiveData<MainViewParam>
        get() = _param

    fun load() {
        viewModelScope.launch {
            delay(1000L)
            _param.value = MainViewParam(
                nickname = "タロー",
                firstName = "太郎",
                lastName = "山田",
            )
        }
    }
}

data class MainViewParam (
    val nickname: String,
    val firstName: String,
    val lastName: String,
)
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewmodel"
            type="com.example.mvvmlab.MainViewModel" />
    </data>


    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewmodel.param.nickname}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

LiveDataを追い出す解決策

interfaceを利用すればすぐにできます。なおレイアウトXMLの変更は不要です。


interface MainViewModel {
    val param: LiveData<MainViewParam>
    fun load()
}

class MainViewModelImpl : ViewModel(), MainViewModel {
    override val param = MutableLiveData<MainViewParam>()
    override fun load() {
        viewModelScope.launch {
            delay(1000L)
            param.value = MainViewParam(
                nickname = "タロー",
                firstName = "太郎",
                lastName = "山田",
            )
        }
    }
}

data class MainViewParam (
    val nickname: String,
    val firstName: String,
    val lastName: String,
)

正直どっちでもいいのですが、ViewModelにLiveData/MutableLiveDataの宣言数が増えてちょっと嫌だなーって思って作って意外と悪くなかったので、もし同じ課題を抱えているのであれば一つの選択肢としてみてはどうでしょうか?
interface増やす必要あるの?みたいな増えるのが嫌そーな反応があればむりにねじ込むようなものではないと思います。

11
6
0

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
11
6