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増やす必要あるの?みたいな増えるのが嫌そーな反応があればむりにねじ込むようなものではないと思います。