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

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

экземпляр?

15 ответов

18 просмотров

Потому что 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. Вся инициализация в одном месте. Удобно же.

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта