экземпляр?
Потому что this разный каждый раз, например.
И как же тогда принято хранить данные, если вьюмодель нифига не гарантирует сохранность данных даже в таких простых случаях?
Гарантирует. Но она же привязана к lifecycle owner. Когда последний из них помер, то и vm удаляется вместе с ним. Вы написали так, что vm каждый раз создается с новым lifecycle owner. Ну и вот. Всё работает строго по уставу. Если, например, vm во фрагментах создавать от их requireActivity, то vm будет жить, пока жива эта активити.
ИМХО, это очень странное поведение, когда фрагмент НЕ пересоздается, если в него происходит возврат из другого фрагмента по кнопке "назад" и пересоздается, если происходит переход через контроллер навигации. Иногда кажется, что все эти созданные якобы для удобства программиста "лучшие практики" лучше не использовать, потому что не понятно в какой момент эти черные ящики тебя подведут.
Устройство навигации и MVVM это как бы абсолютно независимые вещи. Если навигация пересоздаёт фрагмент, то ваш вариант использования навигации не подходит для вашего варианта использования VM.
Это не мой вариант, это рекомендуемый гуглом ( по крайней мере на каком-то период) подход к навигации.
ты идешь вглубь, создавая стек фрагментов, когда юзер чего то делает на экране - скролит куда нибудь - тыкает - снова скролит. фрагменты и не должны уничтожаться в таком случае. вот бы еще вьюхи не уничтожались - но тут гугл библиотека подсирает и все таки вьюху стирает если фрагмент ушел в стек и закрылся другим фрагментом целиком а переход на дестинейшн повторно (боттом нав) - там вообще настраивается (сейчас уже) - по клику ты вернешься в тот же стейт и стек, а по еще раз клику на активный боттом нав - можешь ресетнуть его, зайдя на него заново - как по мне пиздецки удобно
Ваша комбинация приводит к неправильному поведению 🤷♂ Если нав компонент у Гугла устроен так, что он не подходит для использования с VM в том виде, в каком это требуется вам, то что-то нужно заменить.
попробуй navigation либу 2.4 версии ) там уже не так )
С таким же успехом я могу не пользоваться этой библиотекой навигации а просто создавать нужный новый фрагмент при нажатии на кнопку, так хотя бы буду знать что происходит. ))
Просто стараюсь осваивать "лучшие практики", чтобы меньше косячить при освоении этой чертовой мобильной разработки и при трудоустройстве вписываться в коллектив не со своим велосипедом. ))
Я нав компонент не использую, т.к. слышал про него разные интересные отзывы :)
А! Пробовал, но не осилил, как вызвать там apply по аналогии: val vm by lazy { ViewModelProvider(requireActivity()).get(MainViewModel::class.java).apply {
а для чего ты так делал если не секрет
Просто чтобы не отходя от кассы подписаться на LiveData. Вся инициализация в одном месте. Удобно же.
Обсуждают сегодня