如何停止LiveData事件被多次触发

时间:2019-02-14 10:59:35

标签: android mvvm mutablelivedata

我在应用程序中使用MutableLiveData进行基于事件的通信。我有单一活动两个片段的体系结构。

借助ViewModel,我正在使用Fragment-1中的LiveData事件。但是,当我使用菜单栏将Fragment-1替换为Fragment-2并最终返回Fragment-1时,LiveData的旧值又被捕获。

如何避免这个问题?任何帮助/建议都受到高度赞赏! 谢谢。

4 个答案:

答案 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 希望这对您有所帮助!