首页 > 解决方案 > Kotlin:如何在不使用 getter 和 setter 的情况下更改 ViewModel 中 MutableLiveData 的值

问题描述

这是我的视图模型:

class MyProfileEditSharedViewModel : ViewModel() {
    val question = MutableLiveData<String>()
    val answer = MutableLiveData<String>()

    fun setQuestion (q: String) {
        question.value = q
    }

    fun setAnswer (a: String) {
        answer.value = a
    }
}

我使用 setQuestion 和 setAnswer 设置数据,如下所示:

viewModel.setQuestion(currentUserInList.question)
viewModel.setAnswer(currentUserInList.answer)

我尝试从 ViewModel 中获取问题和答案,如下所示:

val qnaQuestionData = communicationViewModel.question as String
val qnaAnswerData = communicationViewModel.answer as String

编译器说我不能将 MutableLiveData 转换为字符串。我应该像我的二传手一样制作一个单独的吸气剂吗?我听说您不需要在 kotlin 中使用 getter 和 setter,是否可以在不使用 getter 和 setter 的情况下在我的视图模型中编辑 val question 和 val answer?

谢谢!!

标签: androidkotlinviewmodel

解决方案


您不能将其转换为,String因为对象的类型是MutableLiveData,但您可以使用.value属性访问该值

val qnaQuestionData = communicationViewModel.question.value
val qnaAnswerData = communicationViewModel.answer.value

在这种情况下,可能会面临MutableLiveData初始化错误。

另一种方法是观察 LiveData 的变化:

communicationViewModel.question.observe(this, Observer{ data->
 ...
})

或者,如果您没有访问任何生命周期所有者

communicationViewModel.question.observeForever(Observer{ data->
 ...
})

但请记得通过removeObserver方法移除观察者

  • 对于设置值,最好直接使用属性或绑定方式
communicationViewModel.question.postValue("some new value")

或者

communicationViewModel.question.value = "some new value"
  • 对 MutableLiveData 属性的建议:
val question: MutableLiveData<String> by lazy { MutableLiveData<String>() }
val answer: MutableLiveData<String> by lazy { MutableLiveData<String>() }

https://developer.android.com/reference/android/arch/lifecycle/LiveData


推荐阅读