Код 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