如何在视图模型中的函数中生成字符串并在 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)
        }