Quand on est un constructeur du Viewmodel appelé dans Android?

0

La question

Je vais à travers ce codelab: https://developer.android.com/codelabs/android-lifecycles#6 Il explique comment utiliser SavedStateHandle dans un ViewModel pour survivre processus de la mort. Le constructeur du ViewModel est comme ci-dessous:

    private SavedStateHandle mState;

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

Et le viewmodel est initialisée dans l'Activité comme suit:

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

Quel est le constructeur du ViewModel appelé? Et comment le Viewmodel obtenir le savedStateHandle paramètre de la ViewModel?

Edit:

J'ai trouvé la réponse à ma question par le biais de ce blog: https://www.rockandnull.com/viewmodel-savedstate/

Il est dit que si l'SavedStateHandle est le seul paramètre dans notre viewmodel le constructeur de la by viewModels délégué à la viewmodel automatiquement.

Cependant, Si nous avons une combinaison de paramètres personnalisés fournis par le framework injection de dépendance(Poignée) e.g: le référentiel, un couple de d'autres d'exécution des arguments e.g: sélectionné ID de la catégorie et de la SavedStateHandle pour nous aider à survivre le processus de la mort dans le constructeur du viewmodel - Comment pouvons-nous fournir tous les paramètres d'usine?

Merci de poster un petit exemple pour ma compréhension

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

La meilleure réponse

4

Le Codelab vous est de vous faire comprendre un Concept spécifique au lieu de l'ensemble du code . Pas de mise en œuvre est assurée par eux au sujet de votre doute , qui est , comment le ViewModel obtenir ses paramètres ?


Vue d'ensemble : En raison de certaines internes de mise en œuvre de ViewModel , vous ne pouvez pas vous passer des arguments à la ViewModel directement , au lieu de cela, vous devez créer une troisième classe qui fournit les paramètres pour le ViewModel.


La réponse à votre doute :

Il existe deux approches par l'intermédiaire de laquelle un ViewModel peut obtenir ses paramètres :

  1. La Non-Injection De Dépendance Moyen: Ici, vous créez une classe étendant ViewModelProvider.Usine . Dans votre code , vous pouvez voir ici :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Ici, une classe par défaut est créé dans lequel , pas les arguments sont passés .Ceci est fait dans le but de l'initialisation , qui est une manière incomplète donnée dans le codelab pour exprimer les besoins . Vous pouvez obtenir une bonne quantité de connaissances sur le même concept via cet article :

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

  1. L'Injection De Dépendance Moyen: Maintenant , ce est la façon la plus simple à mettre en œuvre un ViewModelProviders si vous connaissez DI cadre de Poignée . Ici, vous avez juste besoin d'annoter votre ViewModel avec @ViewModelInject et vous avez terminé .Le DI-cadre dans le backgroun permettra de créer un ViewModelFactory au lieu de vous faire .Ceci est un exemple de code de comment vous fournir des paramètres à ViewModel à l'aide de la Poignée :

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

J'ai débogué l'application de la codelab. Son constructeur est appelé, même si je ne suis pas passer n'importe quelle usine. Comment est-ce possible? Qui passe le SavedStateHandle pour le constructeur?
Neeraja Gandla

Pouvez-vous partager le lien de la demande ? Avez-vous d'exécuter l'application en local sur Android Studio ? Parce que le lien github le code mentionné dans le codelab mentionne quelques usecases et leur solution , il n'y a pas de véritable solution comme une application complète
Karunesh Palekar

Vous pouvez télécharger le code source à partir d'ici: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Aussi s'il vous plaît regardez dans la section d'Édition de la question
Neeraja Gandla

Heureux vous avez obtenu votre réponse .
Karunesh Palekar

Pouvez-vous donner plus de détails sur votre montage ? Je ne reçois pas le contenu exact que vous voulez savoir . ViewModel vous offre la fonctionnalité supplémentaire de la mise en cache de vos données pour l'orientation de l'écran , afin de fournir à ces fonctionnalités , les développeurs ont dû trouver un moyen , où ce fut le seul qu'ils l'ont découvert . Nous avons tous les développeurs android ont à passer par ces instances beaucoup dans notre carrière, j'espère que vous comprenez
Karunesh Palekar

Neeraja Gandla

Dans d'autres langues

Cette page est dans d'autres langues

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