Kotlin:如何在不使用 getter 和 setter 的情况下更改 ViewModel 中 MutableLiveData 的值

Kotlin: How to change values of MutableLiveData in ViewModel without using getters and setters

这是我的视图模型:

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 转换为字符串。 我应该像我的 setter 一样单独制作一个 getter 吗?我听说您不需要在 kotlin 中使用 getters 和 setters,是否可以在不使用 getters 和 [= 的情况下在我的视图模型中编辑 val 问题和 val 答案24=]s?

谢谢!!

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

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

在您的 ViewModel

中创建某种 getter 方法
fun getQuestion(): LiveData<String> {
        return question //this works because MutableLiveData is a subclass of LiveData
}

然后,您可以在任何 class 关心的值中观察值。即:

communicationsViewModel.getQuestion().observe(this, Observer {
       //do something with the value which is 'it'. Maybe qnaQuestionData = it
}

请注意,如果您试图从片段或其他内容中观察值,则必须将此参数更改为 viewLifecycleOwner