我想在我的視圖模型的函式中生成一個字串,并將其作為 LiveData 發送到與此視圖模型關聯的片段,我該怎么做?
例如,我的視圖模型:
class MaskViewModel : ViewModel() {
var mask: MutableLiveData<String> = newQuestion()
fun newQuestion(): MutableLiveData<String>{
mask.value="255"
return mask
}
}
還有我片段中的觀察者:
maskviewModel.mask.observe(viewLifecycleOwner){ result ->
binding.textView3.text=result
}
uj5u.com熱心網友回復:
您的函式不應回傳 LiveData 或替換現有的 LiveData。您應該只有一個 LiveData 實體,因此當 Fragment 觀察它時,它將獲得所有未來的更改。
class MaskViewModel : ViewModel() {
val mask = MutableLiveData<String>()
fun newQuestion() {
mask.value="255"
}
}
但是最好不要將您的 LiveData 暴露為在類之外是可變的,這樣更好:
class MaskViewModel : ViewModel() {
private val _mask = MutableLiveData<String>()
val mask: LiveData<String> get() = _mask
fun newQuestion() {
_mask.value="255"
}
}
uj5u.com熱心網友回復:
您似乎已經準備好觀察mask片段中變數的任何變化。要為其設定新字串,只需mask.postValue(myString)在您的函式中呼叫。這將觸發您的觀察者,它將接收maskas的新值result。
此外,您沒有分配MutableLiveDatato的實體mask。您newQuestion()從不創建 的實體MutableLiveData,而是在它仍然為空時嘗試訪問它。
以這種方式實體化它:val mask: MutableLiveData<String> = MutableLiveData(). 然后你可以呼叫.postValue()它。我已將其更改為,val因為您可以將其保留為相同的參考,但仍可以更改其中的值。var僅當您希望在某個時候將其重新分配給新的時才保留它MutableLiveData,這不太可能。
uj5u.com熱心網友回復:
正如@Tenfour04 在他的回答中提到的,你的函式不應該 return LiveData。
而不是從 your 中回傳字串viewModel,您可以回傳它的 id ,并從片段中呼叫字串。
在里面ViewModel
private val _mask = MutableLiveData<Int>()
val mask: LiveData<Int> get() = _mask
fun newQuestion() {
_mask.value = R.string.mask_value
}
在里面Fragment
maskviewModel.mask.observe(viewLifecycleOwner){ id ->
binding.textView3.text = requireContext().getString(id)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461043.html
