Можно ли передавать данные во фрагмент напрямую через поля вместо аргументов
Что проверяют
Знаете ли вы, что фрагмент пересоздаёт система, а не ваш код, и что поля объекта этого не переживают. Вопрос отделяет тех, кто собирал экраны руками, от тех, кто видел падения после поворота экрана и выгрузки процесса из памяти.
Как отвечать
Технически поля работают: вы создали фрагмент, присвоили значение, оно читается. Ломается всё при пересоздании. После смены конфигурации или возврата в приложение, которое система выгрузила, фрагмент создаётся заново конструктором без аргументов, и поля окажутся пустыми, а Bundle из setArguments система сохраняет и возвращает сама.
Поэтому данные передаются аргументами:
fun newInstance(userId: Long) = ProfileFragment().apply {
arguments = bundleOf(ARG_USER_ID to userId)
}Дальше стоит обозначить границы. В аргументы кладут идентификаторы и мелкие примитивы, а не список на тысячу элементов: транзакция Binder ограничена примерно мегабайтом на процесс, и переполнение даёт TransactionTooLargeException в самый неудобный момент. Крупные данные подтягивает ViewModel по идентификатору, а общее для нескольких экранов состояние живёт во ViewModel родителя или графа навигации. Если проект на Navigation, аргументы объявляются в графе, и Safe Args генерирует типизированный доступ вместо строковых ключей.
Где спотыкаются
Путают поворот экрана и смерть процесса. Первое ловится на эмуляторе за минуту, второе воспроизводится только принудительной остановкой приложения, и именно там всплывают пустые поля.
Зовут setArguments поздно. После присоединения фрагмента это исключение, поэтому аргументы задаются сразу после создания экземпляра.
Считают Bundle универсальным хранилищем и кладут туда объект с картинкой или целым ответом сети. Это уже не передача данных, а способ получить падение на слабом устройстве.