下面是我的ViewModel:
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强制转换为String。 我应该像我的setter一样做一个单独的getter吗? 我听说在kotlin中你不需要使用getters和setters,有没有反正在我的viewmodel中编辑val问题和val答案而不使用getters和setters?
谢谢!!
在ViewModel中创建某种getter方法
fun getQuestion(): LiveData<String> {
return question //this works because MutableLiveData is a subclass of LiveData
}
然后,您可以在您关心值的任何类中观察该值。 即:
communicationsViewModel.getQuestion().observe(this, Observer {
//do something with the value which is 'it'. Maybe qnaQuestionData = it
}
注意如果您试图从片段或其他东西中观察值,则必须将参数this更改为viewLifecycleOwner
您不能将其强制转换为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"
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