我在应用程序中使用MutableLiveData进行基于事件的通信。我有单一活动两个片段的体系结构。
借助ViewModel,我正在使用Fragment-1中的LiveData事件。但是,当我使用菜单栏将Fragment-1替换为Fragment-2并最终返回Fragment-1时,LiveData的旧值又被捕获。
如何避免这个问题?任何帮助/建议都受到高度赞赏! 谢谢。
答案 0 :(得分:1)
您可以使用Event
来包装LiveData
值来处理使用其值,如以下文章所述:
https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150
事件类如下:
open 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
}
让我们说您的LiveData值是一个字符串,那么单个事件的LiveData就像:
val navigateToDetails = MutableLiveData<Event<String>>()
答案 1 :(得分:0)
无论您在哪里观察liveData,都可以在onChanged
方法中通过调用myLiveDataObject.removeObservers(this);
删除观察者。
在观察到首次数据后,这将删除观察者。
答案 2 :(得分:0)
答案被接受的问题是您只能有一个观察员。 article描述了具有多个观察者的解决方案。
答案 3 :(得分:0)
我遇到了同样的问题,并想出了这个库来解决 https://github.com/ueen/LiveEvent 希望这对您有所帮助!