Size: a a a

Android Architecture

2021 May 08

RC

Roman Chumachenko in Android Architecture
Тут можно схитрить - сделай инжект в поле)
источник

JF

Jorik Fat in Android Architecture
а зачем Вам именно  ViewModel?
источник

JF

Jorik Fat in Android Architecture
технически ViewModel выполняет только 1 задачу - переживает LifeCycle. Если Вы используете Toothpick Вы можете создать вообще любой контейнер для этой задачи. Нужно только закрывать Scope в onDestroy().isFinished()
источник

С

Сергей in Android Architecture
Про isFinishing не знал,  спасибо, но он вроде только для активити. А так вроде ViewModel подходит по логике, т.к. отправляет данные во вью и хранит состояние.
источник

RC

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

С

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

RC

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

С

Сергей in Android Architecture
Да, стало красивее, спасибо, обновил гист
источник

RC

Roman Chumachenko in Android Architecture
👌
источник
2021 May 09

С

Сергей in Android Architecture
Потратив ещё 4 часа я получил что хотел. Единственное, что не нравится,  это инъекция в поля, но по другому никак.

Ещё сомневаюсь в решении сообщать вьюмодели о состоянии вью, тут идеально бы подошла Rx с PublishSubject, но я хочу от неё уйти, а лайвдата и flow так не умеют.

Спасибо всем огромное за советы!

Если есть желание потыкать результат, он тут https://github.com/FirstSpectr/ViewModelInheritance
источник

С

Сергей in Android Architecture
источник

С

Сергей in Android Architecture
источник
2021 May 10

A

Aleksei in Android Architecture
а почему это Flow так не умеет?
источник

A

Aleksei in Android Architecture
Есть же  StateFlow
источник

С

Сергей in Android Architecture
Это немного не то, у стейта всегда есть значение, а мне нужно, чтобы событие пропадало, если вью на момент события была уничтожена
источник

AO

Artem Osipov in Android Architecture
А у publishSubject пропадает?)
источник

P

Pavel in Android Architecture
Да. Это behavior subject хранит последний элемент. А publish ничего не хранит.
источник

С

Сергей in Android Architecture
Именно
источник

AO

Artem Osipov in Android Architecture
Получается жизненный цикл вьюхи тут не при чем?
источник

С

Сергей in Android Architecture
Но и тут есть небольшая загвоздка, насколько помню в  андроиде диалог надо показать до наступления onPause, иначе он не сохранится в InstanceState. Поэтому конечное решение это publishSubject, который подписывается в onCreated, отписывается в onDestroyView и при получении данных записывает их в локальную LiveData, чтобы она эти данные показала в правильном жизненном состоянии вью
источник