android - 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?
谢谢!!
解决方案
您不能将其转换为,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
推荐阅读
- google-cloud-platform - 如何设置只能从 App Engine 标准环境连接的 Google CloudSQL 用户
- r - 如何从 df 列表中获取某个变量的 df 名称和第一个输入值
- reactjs - 如何从前端获取 EKS pod 的环境变量?
- ruby - 在 ruby 模块的上下文中,self.method 和常规方法有什么区别?
- javascript - 如何在 JavaScript 飞扬的小鸟代码中使用画布
- bash - 如果文件中有特定名称,则仅打印一次
- python - 如何在 Flask Marshmallow 中验证 Fields.Raw
- c++ - 我可以让 `std::ranges::views::elements` 在我的类型范围内工作吗
- tensorflow - Tensorflow“检测到的边缘创建循环”在适应的 keras 模型训练中
- python - 如何解决 python 中的 HTTP 错误 429 或如何在没有 googletrans 的情况下翻译数据帧?