Миграция с обратного вызова интерфейса на ViewModel + LiveData в компоненте навигации – как запустить инициализацию списAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Миграция с обратного вызова интерфейса на ViewModel + LiveData в компоненте навигации – как запустить инициализацию спис

Сообщение Anonymous »

Я перехожу от шаблона взаимодействия фрагментов на основе интерфейса (через Activity) к компоненту навигации + общей ViewModel + StateFlow.
Устаревший подход (обратный вызов интерфейса)
Из FilterFragment внутри filterApplyButtonOnClick():

Код: Выделить всё

filterListener!!.onFilterApply()
findNavController().popBackStack()
MainActivity:

Код: Выделить всё

override fun onFilterApply() {
filterChangedCallback?.let {
it.onFilterChange()
filterChangedCallback = null
}
}

override fun openMeetingFilter(filterChangedCallback: FilterChangedCallback) {
this.filterChangedCallback = filterChangedCallback
navController.navigate(R.id.action_meetingListFragment_to_ministryMeetingFilterFragment)
}
ListFragment реализует filterChangedCallback:

Код: Выделить всё

override fun onFilterChange() {
initFilter()
initIsGpsOn()
filterChanged = true
}
Открытие фильтра

Код: Выделить всё

meetingListener?.openMeetingFilter(this)
В этой настройке после filterApplyButtonOnClick():
  • Код: Выделить всё

    onFilterChange()
    запускается немедленно
  • Состояние списка инициализируется
  • Затем popBackStack() возвращается в список
Таким образом, ListFragment уже обновляется до того, как он становится видимым.
Новый подход (общая ViewModel + StateFlow)
Теперь я:
  • Навигация с помощью findNavController().navigate(...)
  • Передача фильтра через общую ViewModel
  • Наблюдение StateFlow в ListFragment
Проблема
При такой настройке порядок становится следующим:
  • popBackStack()
  • ListFragment становится видимым
  • Триггеры наблюдателя StateFlow
  • initFilter() запускается
Поэтому инициализация происходит после того, как фрагмент становится видимым, что меняет ожидаемое поведение.
Вопрос
Как я могу воспроизвести устаревшее поведение (выполнить логику обновления до того, как фрагмент станет видимым после popBackStack()) с использованием компонента навигации + общей модели представления, не возвращаясь к интерфейсу обратные вызовы или посредничество действий?
Попытки
Я использовал SharedFlow и saveStateHandle вместо StateFlow, но в обоих случаях инициализация выполняется только после навигации.

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-componen
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»