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.