Как передать данные с одного фрагмента на другой в Android
Что проверяют
Знаете ли вы, что аргументы передаются через Bundle, а не через конструктор, и понимаете ли, почему так.
Как отвечать
Правильный способ зависит от направления обмена.
Передача при открытии экрана: аргументы кладутся в Bundle и присваиваются свойству arguments, а при навигации через компонент Navigation используется генерация типобезопасных аргументов (Safe Args).
findNavController().navigate(
ListFragmentDirections.actionToDetails(jobId = id)
)Причина запрета на конструктор с параметрами: система пересоздаёт фрагмент при повороте и восстановлении процесса, вызывая конструктор без аргументов. Данные, переданные конструктором, при этом теряются, а arguments сохраняются вместе с состоянием.
Возврат результата назад: интерфейс результата фрагментов (setFragmentResult и setFragmentResultListener) вместо устаревшего setTargetFragment.
Обмен между экранами одного графа: общая ViewModel, привязанная к активити или к элементу графа навигации. Подходит, когда данные нужны нескольким экранам и переживают переходы.
Что важно добавить: через аргументы передают идентификаторы и небольшие значения, а не объекты целиком. Всё, что кладётся в Bundle, проходит через транзакцию с ограничением около мегабайта на процесс, и большой список даёт падение. Сами данные берутся по идентификатору из слоя данных.
Где спотыкаются
Делают конструктор с параметрами и теряют данные после поворота.
Передают между экранами объект вакансии целиком вместе с описанием и упираются в ограничение транзакции.
Используют общую ViewModel активити для всего подряд, из-за чего состояние экранов начинает протекать друг в друга.