Když je Viewmodel je konstruktor zavolal Android?

0

Otázka

Já jdu přes to codelab: https://developer.android.com/codelabs/android-lifecycles#6 To vysvětluje, jak používat SavedStateHandle v ViewModel přežít proces smrti. Konstruktor ViewModel je jako pod:

    private SavedStateHandle mState;

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

A viewmodel je inicializován v Činnosti takto:

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

Když je ViewModel je konstruktor jmenuje? A jak vypadá Viewmodel získat savedStateHandle parametr ViewModel?

Edit:

Našel jsem odpověď na svou otázku prostřednictvím tohoto blogpost: https://www.rockandnull.com/viewmodel-savedstate/

To říká, že pokudSavedStateHandle je to jediný parametr, v našem viewmodel je konstruktor by viewModels delegát nabízí k viewmodel automaticky.

Nicméně, Pokud máme kombinaci vlastní parametry, které je poskytována dependency injection framework(Rukojeť) e.g: úložiště, pár jiných runtime argumenty e.g: vybrané kategorie ID a SavedStateHandle, aby nám pomohli přežít proces smrti v viewmodel je konstruktor - Jak můžeme poskytnout všechny tyto parametry do továrny?

Prosím post malý příklad pro mé chápání

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

Nejlepší odpověď

4

Na Codelab jste po je, aby se vám pochopit specifický Pojem místo celý kód . Žádná implementace je poskytována, pokud jde o vaše pochybnosti , což je , jak vypadá ViewModel získat parametry ?


Přehled : Vzhledem k určité vnitřní implementace ViewModel , nelze předat argumenty ViewModel přímo , místo toho musíte vytvořit třetí třídy, která poskytuje parametry ViewModel.


Odpověď na své pochyby :

Existují dva přístupy, jejichž prostřednictvím ViewModel může získat parametry :

  1. Non-Závislost Injekce Způsobem: Zde můžete vytvořit třídu, prodloužení ViewModelProvider.Továrnu . V kódu , zde můžete vidět :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Zde výchozí je vytvořena třída, kde , bez argumenty jsou předány .To se provádí za účelem inicializace , které je nekompletní uvedeny v codelab vyjádřit potřebuje . Můžete získat dobré množství znalostí o stejný koncept prostřednictvím tohoto článku :

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

  1. Závislost Injekce Způsobem: Nyní , to je nejjednodušší způsob, jak realizovat ViewModelProviders pokud víte, DI rámci Rukojeť . Zde stačí, aby komentovat vaše ViewModel s @ViewModelInject a je hotovo .DI rámec v backgroun bude vytvořit ViewModelFactory místo toho, abyste to dělal .Toto je ukázka kódu, jak si stanovit parametry, na ViewModel pomocí Rukojeti :

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

Mám ladit aplikaci z codelab. Je to konstruktor je volána, i když nejsem kolem nějaké továrny. Jak je to možné? Kdo projde SavedStateHandle do konstruktoru?
Neeraja Gandla

Můžete sdílet odkaz na aplikaci ? Jsi spustit aplikaci lokálně na Android Studio ? Protože github odkaz kódů uvedených v codelab zmiňuje některé usecases a jejich řešení , není plnohodnotným řešením, jako je kompletní aplikace
Karunesh Palekar

Zde si můžete stáhnout zdrojový kód zde: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Prosím, podívejte se také do Úpravy sekce otázku
Neeraja Gandla

Šťastný máš svou odpověď .
Karunesh Palekar

Můžete více rozvést vaši editaci ? Nejsem dostat přesný obsah, který chcete vědět . ViewModel poskytuje další funkce pro ukládání do mezipaměti data pro orientace obrazovky , tak, aby poskytovat tyto funkce , vývojáři museli najít cestu , kde to byl jeden našli . Všichni android vývojáři musí projít takové případy hodně v naší kariéře, doufám, že chápete
Karunesh Palekar

Neeraja Gandla

V jiných jazycích

Tato stránka je v jiných jazycích

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