setRetainInstanceState()
больше не используется Здесь говорим о библиотеках
fragment-ktx
версии 1.2.4
и lifecycle-viewmodel-ktx
версии 2.2.0
. Реализация библиотек может быть изменена в будущих версиях.Для начала разберемся как создается
ViewModel
:1.
ViewModel
рекомендуется создавать через вызов Delegated Property by viewModel
, который принимает две функции: ownerProducer: () -> ViewModelStoreOwner
и factoryProducer: (() -> Factory)?
. По-умолчанию ownerProducer
– это функция, возвращающая this
, где this
– это фрагмент, на котором вызван by viewModel
.2.
by viewModel
создает и возвращает объект типа ViewModelLazy
. При создании этого объекта одним из параметров передается функция storeProducer: () -> ViewModelStore
. Эта функция создается следующим образом: { ownerProducer().viewModelStore }
, где ownerProducer
– функция, заданная на предыдущем шаге.3.
ViewModelLazy
имеет один метод get()
, который вызывается при обращении к property, заданной через by viewModel
. При первом вызове метода get()
создается объект ViewModel
и сохраняется в классе ViewModelLazy
. При последующих вызовах get()
возвращается уже созданный ViewModel
.4. Для создания
ViewModel
сначала создается объект ViewModelProvider
, после этого на нем вызывается get()
c классом модели в качестве параметра:ViewModelProvider(store, factory).get(viewModelClass.java)
5. Метод
ViewModelProvider.get()
создает объект ViewModel
с помощью переданной Factory
и сохраняет его во ViewModelStore
, который хранит значения в HashMap
. При последующих вызовах метода ViewModelProvider.get()
, ViewModel
достается из ViewModelStore
.При описанной реализации граф ссылок на объект
ViewModel
во фрагменте выглядит так:Fragment -> ViewModelLazy -> ViewModelProvider -> ViewModelStore -> ViewModel
Т.е. если
Fragment
уничтожен, то ViewModel
тоже будет удалена. Как же
ViewModel
переживает пересоздание фрагмента? Ответ кроется во ViewModelStoreOwner
, который использовался в by viewModel
на первом шаге.В следующем посте мы разберем как и где сохраняется
ViewModelStoreOwner
.