Cuando es un Viewmodel constructor de la llamada en Android?

0

Pregunta

Voy a través de este codelab: https://developer.android.com/codelabs/android-lifecycles#6 Se explica cómo utilizar SavedStateHandle en un ViewModel para sobrevivir proceso de la muerte. El constructor de la ViewModel es la siguiente:

    private SavedStateHandle mState;

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

Y el viewmodel se inicializa en la Actividad de la siguiente manera:

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

Cuando es el ViewModel constructor de la llamada? Y ¿cómo funciona el Viewmodel obtener la savedStateHandle parámetro de la Perspective?

Editar:

He encontrado la respuesta a mi pregunta a través de este blogpost: https://www.rockandnull.com/viewmodel-savedstate/

Se dice que si elSavedStateHandle es el único parámetro en nuestra viewmodel del constructor de la by viewModels delegado proporciona a la perspective de forma automática.

Sin embargo, Si tenemos una combinación de parámetros personalizados de la proporcionada por el marco de inserción de dependencia(Empuñadura). e.g: el repositorio, un par de tiempo de ejecución de argumentos e.g: categoría seleccionada y el ID de la SavedStateHandle para ayudarnos a sobrevivir el proceso de la muerte en la perspective del constructor - ¿Cómo podemos proporcionar todos los parámetros de fábrica?

Favor de poner un pequeño ejemplo de mi entendimiento

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

Mejor respuesta

4

El Codelab está siguiendo es la de hacer comprender un Concepto específico, en lugar de el código en su totalidad . Ninguna aplicación es proporcionada por ellos respecto a su duda , que es , cómo funciona el ViewModel obtener sus parámetros ?


Resumen : Debido a ciertas implementación interna de un ViewModel , usted puede pasar argumentos a la Perspective directamente , en su lugar usted necesita para crear una tercera clase que proporciona los parámetros para el ViewModel.


Respuesta a tu duda :

Hay dos enfoques a través de los cuales una Perspective puede obtener sus parámetros :

  1. No La Inyección De Dependencia Manera: Aquí puede crear una clase que extiende ViewModelProvider.De la fábrica . En el código , aquí se puede ver :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Aquí una clase predeterminada se crea en la cual , no se pasan argumentos .Esto es hecho con el propósito de inicialización , que es una manera incompleta dado en el codelab para expresar las necesidades . Usted puede obtener una buena cantidad de conocimientos sobre el mismo concepto a través de este artículo :

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

  1. La Inyección De Dependencia Manera: Ahora , esta es la forma más sencilla de implementar un ViewModelProviders si sabes DI marco Empuñadura . Aquí usted sólo tiene que anotar su ViewModel con @ViewModelInject y listo .El DI marco en el fondo va a crear un ViewModelFactory en lugar de hacerlo .Este es un código de ejemplo de cómo proporcionar parámetros a ViewModel el uso de Empuñadura :

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

He depurado la aplicación de la codelab. Es constructor se llama aunque yo no soy de pasar cualquier fábrica. ¿Cómo es eso posible? Que pasa el SavedStateHandle al constructor?
Neeraja Gandla

Puedes compartir el enlace a la aplicación ? Hizo ejecutar la aplicación de forma local en Android Studio ? Debido a que el enlace a github el código mencionado en el codelab menciona algunos de los escenarios de uso y su solución , no es de pleno derecho, la solución como una completa aplicación
Karunesh Palekar

Puede descargar el código fuente desde aquí: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

También por favor, busque en la sección Editar de la pregunta
Neeraja Gandla

Feliz tienes tu respuesta .
Karunesh Palekar

Usted puede elaborar más en su edición ? No estoy recibiendo el contenido exacto que usted quiere saber . ViewModel proporciona la funcionalidad extra de almacenamiento en la caché de datos para la orientación de la pantalla , para así proveer la funcionalidad de estos , los desarrolladores tenían que encontrar una manera , en el que este fue el que lo descubrió . Que todos los desarrolladores de android tiene que ir a través de dichas instancias mucho en nuestra carrera, espero que entiendan
Karunesh Palekar

Neeraja Gandla

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................