【发布时间】:2022-01-20 16:45:48
【问题描述】:
我查看了JetSurvey project(Android Jetpack Compose 示例项目)并注意到他们创建了一个类来将 LiveData 值包装在他们的 ViewModel 类中。这是我正在谈论的课程:
/**
* Used as a wrapper for data that is exposed via a LiveData that represents an event.
*/
data class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
在 ViewModel 中,这是这样使用的:
private val _navigateTo = MutableLiveData<Event<Screen>>()
val navigateTo: LiveData<Event<Screen>> = _navigateTo
fun signInAsGuest() {
_navigateTo.value = Event(Survey)
}
似乎 Event 类的目的是避免多次发生导航。但是,我不明白这首先会如何发生,因为只有在 LiveData 值更新后才会触发导航。并且每次更新值时,都会创建一个新的 Event 对象,因此它会再次运行。
那么在 Fragment 中,viewModel.navigateTo.observe(viewLifecycleOwner) 中的代码是否有可能在没有更新值的情况下多次运行?如果是这样,在什么情况下会发生这种情况?
如果我对 Event wrapper 角色的理解不正确,那么它的实现目的是什么?有必要吗?
【问题讨论】:
标签: android kotlin mvvm observable android-livedata