Когда в Android вызывается конструктор Viewmodel?

0

Вопрос

Я просматриваю эту кодовую таблицу: https://developer.android.com/codelabs/android-lifecycles#6 В нем объясняется, как использовать SavedStateHandle в модели представления, чтобы пережить смерть процесса. Конструктор модели представления выглядит следующим образом:

    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
       mState = savedStateHandle;
    }

И модель представления инициализируется в действии следующим образом:

    mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Когда вызывается конструктор ViewModel? И как модель представления получает savedStateHandle параметр модели представления?

Изменить:

Я нашел ответ на свой вопрос в этом блоге: https://www.rockandnull.com/viewmodel-savedstate/

В нем говорится, что еслиSavedStateHandle является ли единственным параметром в конструкторе нашей модели представления by viewModels делегат автоматически предоставляет его модели представления.

Однако, Если у нас есть комбинация пользовательских параметров, предоставленных платформой внедрения зависимостей(Hilt), например: репозиторий, несколько других аргументов среды выполнения, например: идентификатор выбранной категории и сохраненный идентификатор состояния, чтобы помочь нам пережить смерть процесса в конструкторе viewmodel - Как мы можем предоставить все эти параметры фабрике?

Пожалуйста, опубликуйте небольшой пример для моего понимания

android android-lifecycle viewmodel
2021-11-24 03:13:47
1

Лучший ответ

4

Таблица кода, которой вы следуете, предназначена для того, чтобы вы поняли конкретную концепцию, а не весь код . Они не предоставляют никакой реализации в отношении ваших сомнений , а именно : как ViewModel получает свои параметры ?


Обзор : Из-за определенной внутренней реализации ViewModel вы не можете передавать аргументы ViewModel напрямую , вместо этого вам необходимо создать третий класс , который предоставляет параметры ViewModel.


Ответ на ваши сомнения :

Существует два подхода, с помощью которых модель представления может получить свои параметры :

  1. Способ Инъекции Без Зависимости : Здесь вы создаете класс, расширяющий ViewModelProvider.Фабрика. В вашем коде здесь вы можете увидеть :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Здесь создается класс по умолчанию , в котором аргументы не передаются .Это делается с целью инициализации , которая является неполным способом, приведенным в таблице кода для выражения потребностей . Вы можете получить много знаний об одной и той же концепции с помощью этой статьи :

https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel-8fabfec1aa4f

  1. Способ Внедрения Зависимостей : Теперь это самый простой способ реализовать ViewModelProviders , если вы знаете, что такое рукоятка платформы DI . Здесь вам просто нужно аннотировать свою модель представления с помощью @ViewModelInject, и все готово .Платформа DI в backgroun создаст ViewModelFactory вместо того, чтобы вы это делали .Это пример кода того, как вы предоставляете параметры для ViewModel с помощью Hilt :

class SampleViewModel @ViewModelInject constructor(
                     @Assisted private val savedStateHandle: SavedStateHandle) : ViewModel() { }
2021-11-24 04:17:44

Я отладил приложение из лаборатории кода. Это конструктор вызывается, хотя я не передаю никакой фабрики. Как это возможно? Кто передает обработчик сохраненного состояния конструктору?
Neeraja Gandla

Можете ли вы поделиться ссылкой на приложение ? Вы запускали приложение локально в Android Studio ? Поскольку ссылка на github на код , упомянутый в codelab, упоминает некоторые варианты использования и их решение, полноценного решения, подобного полному приложению, не существует
Karunesh Palekar

Вы можете скачать исходный код здесь: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Также, пожалуйста, загляните в раздел Редактирования вопроса
Neeraja Gandla

Рад, что ты получил свой ответ .
Karunesh Palekar

Можете ли вы подробнее рассказать о своем редактировании ? Я не получаю точного содержания, которое вы хотите знать . ViewModel предоставляет вам дополнительную функциональность кэширования ваших данных для ориентации экрана , поэтому , чтобы обеспечить эти функции , разработчикам пришлось найти способ, в котором они это обнаружили . Мы все разработчики Android должны часто проходить через такие случаи в своей карьере, я надеюсь, вы понимаете
Karunesh Palekar

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................