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
这是我的视图模型:
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