Keď je Viewmodel je konštruktéra s názvom Android?

0

Otázka

Idem cez tento codelab: https://developer.android.com/codelabs/android-lifecycles#6 To vysvetľuje, ako používať SavedStateHandle v ViewModel prežiť proces smrti. Konštruktér ViewModel ako je to uvedené nižšie:

    private SavedStateHandle mState;

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

A viewmodel je inicializovaný v Činnosti a dopĺňa takto:

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

Keď je ViewModel je konštruktor volá? A ako sa Viewmodel získať savedStateHandle parameter ViewModel?

Úprava:

Našiel som odpovede na moje otázky cez tento blogpost: https://www.rockandnull.com/viewmodel-savedstate/

To hovorí, že akSavedStateHandle je jediný parameter, v našom viewmodel je constructor na by viewModels delegát ponúka na viewmodel automaticky.

Avšak, Ak máme zmes vlastné parametre, ktoré poskytol dependency injection rámec(Rukoväť) e.g: úloţiska, pár ďalších runtime argumenty e.g: vybrané kategórie ID a SavedStateHandle, aby nám pomohli prežiť proces smrti v viewmodel je constructor - Ako môžeme poskytnúť všetky tieto parametre do továrne?

Prosím, po malý príklad pre moje pochopenie

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

Najlepšiu odpoveď

4

Na Codelab máte nasledujúce je, aby ste pochopili, špecifický Pojem namiesto celý kód . Žiadna implementácia je poskytovaná ich o vaše pochybnosti , ktoré je , ako sa ViewModel si to ukazovateľov ?


Prehľad : Vzhľadom na určité interné realizácie ViewModel , nemôžete prejsť argumenty ViewModel priamo , namiesto toho budete musieť vytvoriť tretej triedy, ktorá poskytuje parametre ViewModel.


Odpoveď na vaše pochybnosti :

Existujú dva prístupy, cez ktoré ViewModel môžete získať je to parametre :

  1. Non-Dependency Injection Spôsobom: Tu môžete vytvoriť triedy rozšírenie ViewModelProvider.Továreň . V kóde , ktoré tu môžete vidieť :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Tu predvolené triedy sa vytvorí, pričom , žiadne argumenty sú prešiel .To sa robí za účelom inicializácia , ktorý je neúplný spôsobom uvedené v codelab vyjadriť potreby . Môžete získať dobré množstvo poznatkov o rovnaký koncept prostredníctvom tohto článku :

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

  1. Dependency Injection Spôsobom: Teraz , toto je najjednoduchší spôsob, ako implementovať ViewModelProviders ak viete DI rámec Rukoväť . Tu stačí komentovať vaše ViewModel s @ViewModelInject a je hotovo .DI rámca v backgroun vytvorí ViewModelFactory namiesto toho robíte to .Toto je vzorový kód, ako môžete poskytnúť parametre ViewModel pomocou Rukoväť :

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

Som si aplikáciu z codelab. Je to constructor sa nazýva aj keď nie som absolvovanie akéhokoľvek výrobcu. Ako je to možné? Kto prechádza SavedStateHandle na konštruktér?
Neeraja Gandla

Môžete zdieľať odkaz na aplikáciu ? Vedeli ste spustiť aplikáciu lokálne na Android Studio ? Pretože github odkaz na kód uvedené v codelab uvádza niektoré usecases a ich riešenie , nie je plnohodnotného riešenie ako úplnú žiadosť
Karunesh Palekar

Môžete si stiahnuť zdrojový kód z tu: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Tiež prosím, pozrite sa do Upraviť v časti otázka
Neeraja Gandla

Radi vás dostal odpoveď .
Karunesh Palekar

Môžete vypracovať viac na vaše upraviť ? Nie som dostať presný obsah, ktorý chcete vedieť . ViewModel vám poskytuje extra funkcie ukladania údajov na orientáciu obrazovky tak, aby poskytovali tieto funkcie , vývojári museli nájsť spôsob, ako , kde to bol jeden zistili . Všetci android vývojári majú ísť cez tieto prípady je veľa v našej kariére, dúfam, že ste pochopili
Karunesh Palekar

Neeraja Gandla

V iných jazykoch

Táto stránka je v iných jazykoch

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