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

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

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

23 ответов

23 просмотра

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

Сергей- Автор вопроса
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 } Инжектить будешь конкретную реализацию вм в конкретной реализации фрагмента

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

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

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

Типа вызывать GetParent и проверять на соответствие GetModuleHandle?
The Bird of Hermes
67
Do any of you guys have interesting projects one could join? I'm a Middle Full-Stack developer (JS/TS, React & Node)
Lev Shapiro
40
$res = json_decode($наша строка из респонса); $res1 = array_map(fn($o) => $o->name, $res->breadcrumbs[0]->entities); Как такое будет на Хаскеле?.. В начале весь джейсон, в ко...
Хаскель Моисеевич Гопник
27
В чем сила брат, в NASM или FASM?
Isaac Kleiner
18
Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
11
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
Хтось використовував Vapor на Windows?
Jaroshevskii
15
Какое виндузовое сообщение приходит TTabSheet, что риэлайняться контролы на нем, даже у которых парент другой? Ситуация: открываю форму - кнопок нет, перелистываю на другой т...
Катерина Свиридова
7
Тут кста кто-нибудь NeoVim использует?
Simple Sorcerer
13
Карта сайта