Возможно ли существование ViewModel без Google реализации
Что проверяют
Понимаете ли вы, что ViewModel это роль в архитектуре MVVM, а не только класс из Jetpack, и знаете ли, за счёт чего Jetpack-версия переживает поворот экрана. Следом часто просят: «Хорошо, напишите свою. Где вы будете её хранить?»
Как отвечать
Ответ «да, возможно», и дальше в два слоя.
Концептуально ViewModel появилась задолго до Android: паттерн MVVM придумали в Microsoft для WPF. В этом смысле ViewModel просто объект, который держит состояние экрана и логику представления и ничего не знает о View. Такой класс пишется на чистом Kotlin без единой зависимости от androidx.
Практически класс androidx.lifecycle.ViewModel решает одну конкретную задачу: пережить пересоздание Activity при смене конфигурации. Механизм такой:
ViewModelStore: хранилище ViewModel, которое принадлежитComponentActivityилиFragment;onRetainNonConfigurationInstance(): системный механизм, через которыйComponentActivityпередаётViewModelStoreновому экземпляруActivityпосле поворота;onCleared(): вызывается, когда экран уходит насовсем, а не на пересоздание. Тогда же отменяетсяviewModelScope.
Своя реализация повторяет эту схему: хранить объект в хранилище, которое переживает пересоздание, отличать поворот от закрытия через isChangingConfigurations и явно освобождать ресурсы. Готовые альтернативы тоже есть: InstanceKeeper в Decompose, презентеры Moxy в старых MVP-проектах, ещё раньше retained-фрагменты с setRetainInstance(true), сейчас устаревшим. Для Kotlin Multiplatform писать своё уже не обязательно: lifecycle-viewmodel стал мультиплатформенным.
Где спотыкаются
Показывают «свою» ViewModel, которая наследует androidx.lifecycle.ViewModel и создаётся через ViewModelProvider. Это та же реализация от Google, а не альтернатива.
Уверены, что ViewModel переживает смерть процесса. Не переживает: для этого нужен SavedStateHandle или onSaveInstanceState, и самописное решение должно закрывать это отдельно.
Держат в самописном хранилище ссылку на Activity, View или их Context. После поворота старую Activity сборщик мусора уже не соберёт, и получается утечка памяти.