提问者:小点点

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


下面是我的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?

谢谢!!


共2个答案

匿名用户

在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"
  • 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