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

Товарищи, по каким причинам val mViewModel = ViewModelProvider(this).get(MainFragmentViewModel::class.java) возвращает новый

экземпляр?

15 ответов

20 просмотров

Потому что this разный каждый раз, например.

Pavel-Vasilev Автор вопроса

И как же тогда принято хранить данные, если вьюмодель нифига не гарантирует сохранность данных даже в таких простых случаях?

Pavel Vasilev
И как же тогда принято хранить данные, если вьюмод...

Гарантирует. Но она же привязана к lifecycle owner. Когда последний из них помер, то и vm удаляется вместе с ним. Вы написали так, что vm каждый раз создается с новым lifecycle owner. Ну и вот. Всё работает строго по уставу. Если, например, vm во фрагментах создавать от их requireActivity, то vm будет жить, пока жива эта активити.

Pavel-Vasilev Автор вопроса

ИМХО, это очень странное поведение, когда фрагмент НЕ пересоздается, если в него происходит возврат из другого фрагмента по кнопке "назад" и пересоздается, если происходит переход через контроллер навигации. Иногда кажется, что все эти созданные якобы для удобства программиста "лучшие практики" лучше не использовать, потому что не понятно в какой момент эти черные ящики тебя подведут.

Pavel Vasilev
ИМХО, это очень странное поведение, когда фрагмент...

Устройство навигации и MVVM это как бы абсолютно независимые вещи. Если навигация пересоздаёт фрагмент, то ваш вариант использования навигации не подходит для вашего варианта использования VM.

Pavel-Vasilev Автор вопроса

Это не мой вариант, это рекомендуемый гуглом ( по крайней мере на каком-то период) подход к навигации.

ты идешь вглубь, создавая стек фрагментов, когда юзер чего то делает на экране - скролит куда нибудь - тыкает - снова скролит. фрагменты и не должны уничтожаться в таком случае. вот бы еще вьюхи не уничтожались - но тут гугл библиотека подсирает и все таки вьюху стирает если фрагмент ушел в стек и закрылся другим фрагментом целиком а переход на дестинейшн повторно (боттом нав) - там вообще настраивается (сейчас уже) - по клику ты вернешься в тот же стейт и стек, а по еще раз клику на активный боттом нав - можешь ресетнуть его, зайдя на него заново - как по мне пиздецки удобно

Pavel Vasilev
Это не мой вариант, это рекомендуемый гуглом ( по ...

Ваша комбинация приводит к неправильному поведению 🤷‍♂ Если нав компонент у Гугла устроен так, что он не подходит для использования с VM в том виде, в каком это требуется вам, то что-то нужно заменить.

Konstantin dmz9
ты идешь вглубь, создавая стек фрагментов, когда ю...

попробуй navigation либу 2.4 версии ) там уже не так )

Pavel-Vasilev Автор вопроса
Konstantin dmz9
ты идешь вглубь, создавая стек фрагментов, когда ю...

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

Pavel-Vasilev Автор вопроса

Просто стараюсь осваивать "лучшие практики", чтобы меньше косячить при освоении этой чертовой мобильной разработки и при трудоустройстве вписываться в коллектив не со своим велосипедом. ))

Pavel Vasilev
Просто стараюсь осваивать "лучшие практики", чтобы...

Я нав компонент не использую, т.к. слышал про него разные интересные отзывы :)

А! Пробовал, но не осилил, как вызвать там apply по аналогии: val vm by lazy { ViewModelProvider(requireActivity()).get(MainViewModel::class.java).apply {

Leonid B.
А! Пробовал, но не осилил, как вызвать там apply п...

а для чего ты так делал если не секрет

Konstantin dmz9
а для чего ты так делал если не секрет

Просто чтобы не отходя от кассы подписаться на LiveData. Вся инициализация в одном месте. Удобно же.

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
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
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта