214 похожих чатов

Как думаете насколько критично передавать во фрагмент данные через конструктор?

arguments ведь это такая морока. Как часто можно столкнуться с тем что фрагмент воссоздан и данные потерялись. Кстати в каком виде будут данные которые передавались в воссозданном фрагменте, если они non-null. Будут краш сразу же при обращении, что объект null хотя не может им быть?

58 ответов

99 просмотров

Категорически обязательно

Turalllb-Turalll Автор вопроса
Алексей Ершов
Категорически обязательно

а была ли такая же проблема с Dialog ? там ведь может ровна эта же проблема случиться. не DialogFragment а именно DIalog

Turalllb-Turalll Автор вопроса
Алексей Ершов
Категорически обязательно

в архитектуре подобной декомпоузу все сразу оказывается во вьюмодели и вообще забываешь про все bundle

Turalllb Turalll
а была ли такая же проблема с Dialog ? там ведь мо...

Диалог не восстанавливается после смерти процесса и даже смены конфигурации

Turalllb Turalll
в архитектуре подобной декомпоузу все сразу оказыв...

Если вы хотите поддерживать восстановление состояния приложения после смерти процесса, вы никогда не можете забыть про сериализацию этого самого состояния

Turalllb-Turalll Автор вопроса
Алексей Ершов
Диалог не восстанавливается после смерти процесса ...

спасибо, понял, значит у диалогов нет необходимости в восстановлении, вот и проблемы не было

Turalllb-Turalll Автор вопроса
Алексей Ершов
Если вы хотите поддерживать восстановление состоян...

ну скорее вопрос о том, насколько часто случается такое , что происходит восстановление

Turalllb-Turalll Автор вопроса
Ivan Sablin
вьюмодели живут не вечно

ну до тех пор пока single activity жив , они есть или немного не так было организовано хранение стэка вьюмоделей

Turalllb Turalll
ну скорее вопрос о том, насколько часто случается ...

часто, как часто процесс будет завершаться зависит от того хватает ли памяти в процессе пользования телефоном. Короче часто 🙂

Turalllb Turalll
ну скорее вопрос о том, насколько часто случается ...

Сплошь и рядом, просто в хорошо сделанном приложении вы этого не замечаете. Типичный кейс: 1) вы регистрируетесь в приложении, заполнили форму из 15 полей 2) оно говорит, сделайте фото! 3) открывается стандартное приложение с камерой 4) система убивает ваше приложение, потому что оно свернулось в фон (это разумеется не всегда случится, но очень возможно) 5) вы делаете фотку, возвращаетесь в свое приложение, а вся информация о регистрации слететла, и вы открыли его как с чистого листа Ругань, удаление приложения, единица в маркете и гневный отзыв

Turalllb-Turalll Автор вопроса
Алексей Ершов
Сплошь и рядом, просто в хорошо сделанном приложен...

ну все такое я бы хранил во вьюмодели, но но если и корневая активность будет уничтожена, то беда

Turalllb Turalll
ну все такое я бы хранил во вьюмодели, но но если ...

Система убивает весь процесс приложения, всё что было в рантайме, в оперативной памяти, уничтожается.

просите и воздастся вам! Теперь аргументы передаются именно в контруктор, как вы и хотели! Но есть один момэнт... придется обмазаться кучей фабрик и написать еще больше кода, чем с бандлом :)) https://medium.com/capital-one-tech/android-fragmentfactory-75823af015fd

Turalllb-Turalll Автор вопроса
Kopusha
просите и воздастся вам! Теперь аргументы передают...

неет, спасибо)) через companion через простую фабрику понятно, в местах применения зато кода будет меньше, но это все равно много кода.

Kopusha
просите и воздастся вам! Теперь аргументы передают...

с бандлом на 3 строчки больше написать)

Turalllb Turalll
в архитектуре подобной декомпоузу все сразу оказыв...

И самое главное, в Decompose все аргументы переданные в компонент (вью модель) автоматически сохраняются и восстанавливаются после смерти процесса.

Turalllb-Turalll Автор вопроса
Arkadii Ivanov
И самое главное, в Decompose все аргументы передан...

Вот это я хотел услышать и понимал что это должно быть реализовано. Просто ещё до появления деклмпоуз у нас на проекте лид запилил подобную библиотеку . Точно такой же подход, но вот после смерти активности стэк бы не сохранился. Но и мы не парились по этому поводу, приложение было онлайн кинотеатром и ему там нечего было запоминать

Arkadii Ivanov
И самое главное, в Decompose все аргументы передан...

А каким образом это реализовано? Как, например, сохраняется лямбда? Или там тоже ворох условий того, что можно, а что нельзя?

Konstantin Dovnar
А каким образом это реализовано? Как, например, со...

Каждый компонент представлен классом-конфигурацией, все конфигурации Parcelable. В роутер передаётся factory функция, которая создаёт компонент по его конфигурации. Т.е. в самих конфигурациях лежат только минимально необходимые данные для создания экземпляров компонентов. Например Config.DetailsScreen(selectedId: Long) : Parcelable. А лямбды и другие зависимости передаются в factory: when (config) { is Config.Details -> DetailsComponent(id = x, onFinishClick: () -> Unit) }

Arkadii Ivanov
Каждый компонент представлен классом-конфигурацией...

Видимо, слишком сложная информация для моего пьяного мозга, ладно. А как компоуз устроен с точки зрения восстановления стека известно? С фрагментами мне кажется, если пытаться сохранить колбеки, то можно выстрелить себе в хй, если передать лямбду, которая будет ссылаться на предыдущий фрагмент, а он выгрузится и убьётся. Тут нет? UPD. Т.е., есть допустим ListFragment и DetailsFragment. Мы из листа открываем детейлс, с передачей лямбды, которая внутри что-то делает с самим ListFragment. Вдруг всё убивается и при восстановлении у нас полноценно восстанавливается только DetailsFragment. Вызывается лямбда где-то там дальше и всё падает.

Konstantin Dovnar
Видимо, слишком сложная информация для моего пьяно...

В композ для навигации отдельная библиотека, в которой аргументы в строке передаются. Она и сохраняет стек.

Arkadii Ivanov
В композ для навигации отдельная библиотека, в кот...

Добавил UPD с примером в сообщении выше. Компоуз такое переживёт? (Я не уверен, что даже фрагменты упадут)

Konstantin Dovnar
Добавил UPD с примером в сообщении выше. Компоуз т...

Так лямбды не сохраняются в бандл, даже во фрагментах

Arkadii Ivanov
Так лямбды не сохраняются в бандл, даже во фрагмен...

Да. Но как я понял из обсуждения выше в декомпоузе у тебя как-раз можно передать что угодно как аргумент, в том числе лямбду, нет? И что у кого-то подобное решение было с фрагментами, с кастомным сохранением. И если так, то как поведёт себя компоузабл, если в неё передали лямбду, а процесс умер и восстановился?

Konstantin Dovnar
Да. Но как я понял из обсуждения выше в декомпоуз...

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

Arkadii Ivanov
Лямбды можно передавать как аргументы, но их не на...

Так, а как заставить их пережить смерть и восстановление?

Konstantin Dovnar
Так, а как заставить их пережить смерть и восстано...

Они не должны переживать, новый экран создаётся с новыми коллбеками. А в бандл сохраняется только информация о том, какой именно фрагмент надо создать.

Arkadii Ivanov
Они не должны переживать, новый экран создаётся с ...

Может ли система пересоздать фрагмент при его живой активити?

Arkadii Ivanov
Они не должны переживать, новый экран создаётся с ...

Лямбда же создаётся на месте вызова. Допустим в предыдущем фрагменте. Как туда дойдут вызовы после пересоздания, если пересоздается активный фрагмент?

Arkadii Ivanov
Нет

Как тогда происходят интересные глюки, когда после пересоздания фрагмента какие-то поля у фрагмента оказываются неинициализированными? 🤔 (распространенный антипаттерн, когда фрагменту после создания устанавливают извне листенеры, вызывают методы и т.п.)

Konstantin Dovnar
Лямбда же создаётся на месте вызова. Допустим в п...

Нет, каждый фрагмент надо создавать в его фрагменте-предке, дочерние фрагменты могут сообщать предку, что надо открыть другой фрагмент.

Arkadii Ivanov
Не знаю как так получается у людей :-)

Ну вот и мне интересно. Получается же. И выглядит так, что фрагмент пересоздается при живой активити. Иначе, если пересоздается активити, то она создаст фрагмент и заново установит листенеры и т.п.

Leonid B.
Ну вот и мне интересно. Получается же. И выглядит ...

Я бы посмотрел на пример, когда так происходит. Уверен, что-то не так сделали.

Arkadii Ivanov
Я бы посмотрел на пример, когда так происходит. Ув...

Например, типа такого кода в активити: val f = MyFragment() // или даже параметры в конструкторе фрагмента f.myListener = { ... } f.initSomeLateinitFields(1, "abc") fragmentManager.add(f)...

Leonid B.
Например, типа такого кода в активити: val f = MyF...

Если используется FragmentFactory, то именно она создаёт фрагмент второй и последующие разы. Там и передаются аргументы в конструктор всегда.

Arkadii Ivanov
Если используется FragmentFactory, то именно она с...

Не не не. С factory каждый может. Именно так, как у меня в примере.

Leonid B.
Не не не. С factory каждый может. Именно так, как ...

Так и делается в фактори, можно в конструктор, можно сеттерами

Arkadii Ivanov
Так и делается в фактори, можно в конструктор, мож...

Фабрику же назначают фрагмент менеджеру, а не напрямую вызывают.

Arkadii Ivanov
Ага

Тогда не понимаю смысл сего действа: override fun onCreate(savedInstanceState: Bundle?) { childFragmentManager.fragmentFactory = fragmentFactory super.onCreate(savedInstanceState) if (savedInstanceState == null) { childFragmentManager .beginTransaction() .add(R.id.content, fragmentFactory.mainFragment(), TAG_MAIN) .commit() } } Фабрику присвоили, а фрагмент создаем все равно руками 🤷

Leonid B.
Тогда не понимаю смысл сего действа: override ...

После пересоздания активити, фрагмент будет создан автоматически фабрикой.

Arkadii Ivanov
После пересоздания активити, фрагмент будет создан...

Тогда зачем в первый раз создавать фрагмент руками? По идее, достаточно передать класс, а фабрика сделает остальное.

Leonid B.
Тогда зачем в первый раз создавать фрагмент руками...

Потому, что надо аргументы указать, которые Bundle

Arkadii Ivanov
Потому, что надо аргументы указать, которые Bundle

fragmentFactory.mainFragment() здесь же нет аргументов

Leonid B.
fragmentFactory.mainFragment() здесь же нет аргум...

Аа, этому фрагменту не нужны аргументы. Там есть details, вот ему нужны. Но API один общий

Arkadii Ivanov
Аа, этому фрагменту не нужны аргументы. Там есть d...

У details внутри есть аргументы, а при создании нет fun detailsFragment(): DetailsFragment

Leonid B.
У details внутри есть аргументы, а при создании не...

Посмотрите внимательнее пожалуйста, поиском по setArguments. Ещё можно запустить пример и убедится, что аргументы всегда на месте.

Arkadii Ivanov
Посмотрите внимательнее пожалуйста, поиском по set...

Мне, главным образом, интересна работа с фабрикой. Поскольку фабрика создает фрагмент по имени класса, то получается, что больше не следует руками создавать фрагменты так, как здесь: fragmentFactory.mainFragment()

Leonid B.
Мне, главным образом, интересна работа с фабрикой....

Фрагменты приходится создавать руками в первый раз, потому что надо передать аргументы.

Leonid B.
Аа, понятно...

Почитайте статью, которую я выше отправлял здесь. Там я всё описал.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта