Quando è un Viewmodel del costruttore chiamato in Android?

0

Domanda

Sto attraversando questo codelab: https://developer.android.com/codelabs/android-lifecycles#6 Questo spiega come utilizzare SavedStateHandle in un ViewModel per sopravvivere processo di morte. Il costruttore del ViewModel è come qui sotto:

    private SavedStateHandle mState;

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

E il viewmodel è inizializzato in Attività come segue:

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

Quando è il ViewModel del costruttore chiamato? E come fa il Viewmodel ottenere i savedStateHandle parametro del ViewModel?

Edit:

Ho trovato la risposta alla mia domanda attraverso questo blogpost: https://www.rockandnull.com/viewmodel-savedstate/

Si dice che se ilSavedStateHandle è l'unico parametro nel nostro viewmodel del costruttore il by viewModels delegato fornisce al viewmodel automaticamente.

Tuttavia, Se si dispone di una combinazione di parametri personalizzati che ha fornito il quadro di iniezione di dipendenza(in Fondo) e.g: il repository, un altro paio di runtime argomenti e.g: categoria selezionata ID e la SavedStateHandle per aiutarci a sopravvivere il processo di morte nel viewmodel costruttore - Come possiamo fornire tutti i parametri di fabbrica?

Si prega di inviare un piccolo esempio per la mia comprensione

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

Migliore risposta

4

Il Codelab si sta seguendo è quello di farti capire un Concetto specifico, invece di tutto il codice . Nessuna implementazione è fornito da loro per quanto riguarda il tuo dubbio , che è , come funziona il ViewModel ottenere i parametri ?


Panoramica : A causa di alcuni implementazione interna del ViewModel , non è possibile passare argomenti al ViewModel direttamente , invece è necessario creare una terza classe che fornisce i parametri per il ViewModel.


La risposta al tuo dubbio :

Ci sono due approcci attraverso i quali un ViewModel può ottenere parametri :

  1. Non Dependency Injection Modo: Qui è possibile creare una classe che estende ViewModelProvider.Di fabbrica . Nel tuo codice , qui potete vedere :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Qui una classe predefinita viene creato in cui , senza argomenti vengono passati .Questo viene fatto con lo scopo di inizializzazione , che è un modo parziale dato in codelab di esprimere le esigenze . Si può ottenere una buona quantità di conoscenze sul concetto stesso tramite questo articolo :

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

  1. La Dependency Injection Modo: Ora , questo è il modo più semplice per implementare un ViewModelProviders se si conosce quadro DI Fondo . Qui hai solo bisogno di annotare il ViewModel con @ViewModelInject e si è fatto .DI quadro in mod crea un ViewModelFactory invece di farlo .Questo è un codice di esempio di come si forniscono i parametri per ViewModel utilizzando Elsa :

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

Ho debuggato l'app dal codelab. È costruttore viene chiamato anche se non sto passando tutti in fabbrica. Come è possibile? Chi passa il SavedStateHandle al costruttore?
Neeraja Gandla

Puoi condividere il link per l'applicazione ? Non è possibile eseguire l'applicazione in locale su Android Studio ? Perché github link per il codice riportato nel codelab menziona alcuni usi e la loro soluzione , non c'è vera e propria soluzione come un'applicazione completa
Karunesh Palekar

È possibile scaricare il codice sorgente da qui: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Inoltre, si prega di guardare nella sezione di Modifica della domanda
Neeraja Gandla

Felice di aver ricevuto la tua risposta .
Karunesh Palekar

Puoi dirci qualcosa di più sulla tua modifica ? Non ricevo il contenuto esatto che si desidera sapere . ViewModel fornisce le funzionalità di memorizzazione nella cache i dati per l'orientamento dello schermo , così da poter fornire queste funzionalità , gli sviluppatori hanno dovuto trovare un modo , in cui questa era quella che avevano scoperto . Abbiamo tutti gli sviluppatori di android hanno di andare attraverso tali istanze molto nella nostra carriera, spero che tu capisca
Karunesh Palekar

Neeraja Gandla

In altre lingue

Questa pagina è in altre lingue

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