Будет ли это же значение вызывать событие в LiveDate? - PullRequest
0 голосов
/ 26 мая 2020

Код A и изображение A взяты из художественного LiveData с SnackBar, Navigation и другими событиями (случай SingleLiveEvent) .

Автор сказал мне «Запустить событие, установив новое Событие как новое значение» , я думаю, что это должно быть »Запустить событие, установив новое Событие как любое value ", верно?

Например,

Шаг 1: пользователь нажимает кнопку в главном действии с кодом userClicksOnButton("StartDetails"), запускается подробное действие.

Шаг 2: пользователь нажимает назад, возвращаясь к основному действию

Шаг 3: пользователь снова нажимает кнопку в главном действии с кодом userClicksOnButton("StartDetails"), снова запускается действие «Подробности».

Правильно?

Код A

class ListViewModel : ViewModel {
    private val _navigateToDetails = MutableLiveData<Event<String>>()

    val navigateToDetails : LiveData<Event<String>>
        get() = _navigateToDetails


    fun userClicksOnButton(itemId: String) {
        _navigateToDetails.value = Event(itemId)  // Trigger the event by setting a new Event as a new value
    }
}

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
}

myViewModel.navigateToDetails.observe(this, Observer {
    it.getContentIfNotHandled()?.let { // Only proceed if the event has never been handled
        startActivity(DetailsActivity...)
    }
})

Изображение A enter image description here

1 Ответ

1 голос
/ 29 мая 2020

У вас есть два разных ограничения на данные.

LiveData передает каждое обновление активным наблюдателям, но само событие сохраняет состояние. Таким образом, событие новое требуется как новое значение LiveData. itemId может быть любым значением, но комментарий к нему не относится.

Запуск события, установив новое событие как [новое] значение

...