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

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

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

23 ответов

37 просмотров

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

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта