import androidx.annotation.MainThread import androidx.lifecycle.MutableLiveData import java.util.LinkedList import java.util.Queue /** * Класс-очередь для обработки временных событий, не являющихся частью View * Например, показ SnackBar с сообщением или ошибкой. */ class EventsQueue : MutableLiveData>() { @MainThread fun offer(event: Event) { val queue = (value ?: LinkedList()).apply { add(event) } value = queue } } /** * Подписка на [LiveData] с очередью одноразовых событий (например, показы снэкбаров и диалогов). * @see EventsQueue */ fun Fragment.observe(eventsQueue: EventsQueue, eventHandler: (Event) -> Unit) { eventsQueue.observe(viewLifecycleOwner) { queue: Queue? -> while (queue != null && queue.isNotEmpty()) { eventHandler(queue.remove()) } } }