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

Подскажите, а у fragmentа может быть несколько ViewModel? У меня

есть логика, которая должна быть на всех используемых фрагментах, вот думаю, что если я создам абстрактный класс фрагмента, в который буду инжектить commonViewModel? Т.е. в реализации фрагмента своя вьюмодель, а у абстрактного родителя своя.
Не сойдёт ли с ума инжектор зависимостей?

23 ответов

59 просмотров

Мб как вариант использовать вм активити

Сергей- Автор вопроса
brrr
Мб как вариант использовать вм активити

Увы, нужна именно привязка к конкретным фрагментам чтобы юзать правильный fragmentManager. В общем инжектор действительно сходит с ума, т.к. сразу видит 2 модели которые надо заинжектить, но умеет инжектить только одну. Тут как я понял два варианта: 1. Инжектить обе вьюмодели в реализации фрагмента (Но тогда в каждой реализации надо не забывать об этом) 2. Вместо инжекта тянуть конкретный инстанс, что я и сделал. И вроде бы это то, что надо Реализация спокойно инжектит поля помеченные inject, а абстрактный класс ручками тянет нужный ему инстанс и они не мешают друг другу

Можно иметь shared viewmodel, привязанную к активити. Другой вопрос, нужно ли)

Сергей
Увы, нужна именно привязка к конкретным фрагментам...

у тебя вьюмодель инжектится прямо в поле фрагмента? @Inject val viewModel = .... вот так?

Сергей- Автор вопроса
Oleg
Можно иметь shared viewmodel, привязанную к активи...

Увы, но не подходит, у меня у каждого фрагмента должна быть своё личное состояние, т.е. каждому нужна своя вью модель, но такая же как у всех. Мой вариант в целом рабочий, я только пытаюсь сейчас сделать так, чтобы вьюмодель стопила подписку, когда привязанный к ней фрагмент невидим пользователю, пока сделал это прокидывая во вьюмодель события onDesroyView и onCreateView

Слушай, а почему бы не сделать подкласс viewmodel с этой логикой? А потом наследуй VM фрагмента от этого класса, когда нужно

Сергей
Увы, но не подходит, у меня у каждого фрагмента до...

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

Сергей- Автор вопроса
Roman Chumachenko
Слушай, а почему бы не сделать подкласс viewmodel ...

Думал об этом, на что-то странное выходит. Кейс такой: прилетают события - надо показать диалог. Т.е. на базовую VM, должен подписаться базовый фрагмент, а чтобы это сделать, нам в базовом фрагменте уже надо иметь ссылку на вьюмодель, получается надо её объявлять в базовом, а потом кастовать в наследнике к нужной... Попробую сделать так тестовый проект, а то чёт каша.

Сергей- Автор вопроса
Pêcheur
а что там за подписка такая, которую во вьюмоедли ...

Во фрагменте сейчас и есть подписка, но нужно сохранять стейт полученный через неё, для этого используется deprecated retainInstance, от которого я пытаюсь избавиться.

Сергей
Думал об этом, на что-то странное выходит. Кейс та...

а на чем реактивщина у тебя? лайвдата? флоу? Rx?

Сергей
Думал об этом, на что-то странное выходит. Кейс та...

Не надо кастовать, иметь не надо тоже. Абстрактное поле для получения VM можно сделать в базе фрагмента. Возвращать будет не AbsVewModel, а дженерик

Сергей- Автор вопроса
Сергей- Автор вопроса
Сергей
Repo -> VM - RX, VM -> View - LiveData

для сохранения стэйта в Rx есть BehaviorSubject

Сергей- Автор вопроса
Roman Chumachenko
Не надо кастовать, иметь не надо тоже. Абстрактное...

Увы не взлетело, споткнулся на том, что чтобы унаследоваться от VM, мне ей надо передать в конструктор нужные зависимости (репозиторий), а значит придётся его пихать во всех наследников

Сергей
Увы не взлетело, споткнулся на том, что чтобы унас...

Тут можно схитрить - сделай инжект в поле)

Можешь сделать эту VM - компонентом коина. Грязноватый трюк, но в конструкторы не надо бросать ничего

Сергей- Автор вопроса
Roman Chumachenko
Можешь сделать эту VM - компонентом коина. Грязнов...

У меня toothpick вместо коина. Но в итоге я походу сделал, получилась весёлая дичь с Warning'ами "Unchecked cast" и "Leaking 'this' in constructor of non-final class", но работает. Использовать это я конечно же не буду... https://gist.github.com/FirstSpectr/da22944e9300cbd003490818ff838e84

Сергей
У меня toothpick вместо коина. Но в итоге я походу...

Можно базовый фрагмент сделать универсальнее, чтобы не делать кастов. BaseFragment<VM : BaseViewModelImpl> { abstract val viewModel: VM } Инжектить будешь конкретную реализацию вм в конкретной реализации фрагмента

Сергей- Автор вопроса

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта