如何在视图模型中的函数中生成字符串并在 Kotlin 中的片段中生成 return?
How can I generate a String in a function in a viewmodel and return to a fragment in Kotlin?
我想在我的视图模型中的函数中生成一个字符串,并将其作为 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
}
您似乎已准备好观察片段中 mask
变量的任何变化。要为其设置一个新的字符串,只需在您的函数中调用 mask.postValue(myString)
即可。这将触发您的观察者,它将接收 mask
作为 result
.
的新值
此外,您没有将 MutableLiveData
的实例分配给 mask
。您的 newQuestion()
永远不会创建 MutableLiveData
的实例,而是在它仍然为 null 时尝试访问它。
以这种方式实例化它:val mask: MutableLiveData<String> = MutableLiveData()
。然后你可以在上面调用 .postValue()
。我已将其更改为 val
,因为您可以将其保留为相同的参考,但仍会更改其中的值。仅当您希望在某个时候将其重新分配给新的 MutableLiveData
时才将其保留为 var
,这不太可能。
您的函数不应 return LiveData 或替换现有的 LiveData。您应该只有一个 LiveData 实例,这样当 Fragment 观察到它时,它将获得所有未来的更改。
class MaskViewModel : ViewModel() {
val mask = MutableLiveData<String>()
fun newQuestion() {
mask.value="255"
}
}
但最好不要将 LiveData 公开为在 class 之外可变的封装,所以这样更好:
class MaskViewModel : ViewModel() {
private val _mask = MutableLiveData<String>()
val mask: LiveData<String> get() = _mask
fun newQuestion() {
_mask.value="255"
}
}
正如@Tenfour04 在他的回答中提到的,你的函数不应该 return LiveData
.
而不是 return 从你的 viewModel
中获取字符串,你可以 return 它是 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)
}
我想在我的视图模型中的函数中生成一个字符串,并将其作为 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
}
您似乎已准备好观察片段中 mask
变量的任何变化。要为其设置一个新的字符串,只需在您的函数中调用 mask.postValue(myString)
即可。这将触发您的观察者,它将接收 mask
作为 result
.
此外,您没有将 MutableLiveData
的实例分配给 mask
。您的 newQuestion()
永远不会创建 MutableLiveData
的实例,而是在它仍然为 null 时尝试访问它。
以这种方式实例化它:val mask: MutableLiveData<String> = MutableLiveData()
。然后你可以在上面调用 .postValue()
。我已将其更改为 val
,因为您可以将其保留为相同的参考,但仍会更改其中的值。仅当您希望在某个时候将其重新分配给新的 MutableLiveData
时才将其保留为 var
,这不太可能。
您的函数不应 return LiveData 或替换现有的 LiveData。您应该只有一个 LiveData 实例,这样当 Fragment 观察到它时,它将获得所有未来的更改。
class MaskViewModel : ViewModel() {
val mask = MutableLiveData<String>()
fun newQuestion() {
mask.value="255"
}
}
但最好不要将 LiveData 公开为在 class 之外可变的封装,所以这样更好:
class MaskViewModel : ViewModel() {
private val _mask = MutableLiveData<String>()
val mask: LiveData<String> get() = _mask
fun newQuestion() {
_mask.value="255"
}
}
正如@Tenfour04 在他的回答中提到的,你的函数不应该 return LiveData
.
而不是 return 从你的 viewModel
中获取字符串,你可以 return 它是 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)
}