Обновление UI во Fragment только при активном состоянии и новом State

Собирайте состояние в viewLifecycleOwner.lifecycleScope внутри repeatOnLifecycle(STARTED). Это останавливает подписку вместе с View и возобновляет её при возвращении экрана.

Короткий ответ

Что ответить на собеседовании

Собирайте состояние в viewLifecycleOwner.lifecycleScope внутри repeatOnLifecycle(STARTED). Это останавливает подписку вместе с View и возобновляет её при возвращении экрана.

Подробный разбор

Ответ с пояснениями

Условие

Внутри фрагмента осуществляется подписка на объект State, используемый в MV‑паттерне. Необходимо реализовать логику, при которой представление (View) фрагмента будет обновляться лишь в том случае, когда фрагмент находится в активном состоянии жизненного цикла и поступает новое значение состояния.

Ответ

Собирайте состояние в viewLifecycleOwner.lifecycleScope внутри repeatOnLifecycle(STARTED). Это останавливает подписку вместе с View и возобновляет её при возвращении экрана.

viewLifecycleOwner.lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.state.collect { state -> render(state) }
    }
}

StateFlow сам объединяет равные последовательные значения; для обычного Flow при необходимости добавляют distinctUntilChanged. После пересоздания View последнее состояние нужно отобразить снова, даже если оно не изменялось: новую View ещё не отрисовали. Если «активный» означает только RESUMED, выбирают этот порог явно.

Источник: developer.android.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее