Atunci când este o Viewmodel constructorul numit în Android?

0

Problema

Am de gând prin acest codelab: https://developer.android.com/codelabs/android-lifecycles#6 Acesta explică cum să utilizați SavedStateHandle într-un ViewModel pentru a supraviețui procesului de moarte. Constructorul de ViewModel este ca mai jos:

    private SavedStateHandle mState;

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

Și viewmodel este inițializat în Activitate, după cum urmează:

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

Atunci când este ViewModel constructorul numit? Și cum nu Viewmodel obține savedStateHandle parametru de ViewModel?

Edit:

Am găsit răspunsul la întrebarea mea prin acest blogpost: https://www.rockandnull.com/viewmodel-savedstate/

Se spune că, dacăSavedStateHandle este singurul parametru în nostru viewmodel este constructorul by viewModels delega oferă să viewmodel automat.

Cu toate acestea, Dacă avem o combinație de parametri personalizate furnizate de injectare dependență cadru(Mâner) e.g: magazia, o serie de alte argumente de rulare e.g: categoria selectată ID-ul și SavedStateHandle pentru a ne ajuta să supraviețuiască procesului de moarte în viewmodel constructor - Cum putem oferi toate aceste parametri de fabrica?

Vă rugăm să posta un mic exemplu pentru înțelegerea mea

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

Cel mai bun răspuns

4

La Codelab sunt următoarele este de a face să înțelegi un Concept specific în loc de tot codul . Punerea în aplicare este prevăzută de ei în ceea ce privește îndoiala ta , care este , cum ViewModel obține parametrii ?


Privire de ansamblu : Din cauza unor punerea în aplicare internă a ViewModel , nu poți să treci argumente pentru a ViewModel direct , în loc să aveți nevoie pentru a crea o a treia clasă care oferă parametrii pentru a ViewModel.


Răspunsul la îndoială :

Există două abordări prin care o ViewModel poate obține parametrii :

  1. Non-Injectare Dependență Mod: Aici veți crea o clasă de prelungire ViewModelProvider.Fabrica . În codul dvs. , puteți vedea aici :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Aici un default clasa în care este creat , nu argumentele sunt transmise .Acest lucru se face în scopul de inițializare , care este un mod incomplet dat în codelab să-și exprime nevoile . Puteți obține o sumă bună de cunoștințe pe același concept prin intermediul acestui articol :

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

  1. Injectare Dependență Mod: Acum , acest lucru este cel mai simplu mod de a implementa o ViewModelProviders dacă știi DI-cadru Mâner . Aici ai nevoie doar pentru a adnota ViewModel cu @ViewModelInject și ați terminat .DI-cadru în backgroun va crea un ViewModelFactory în loc să faci asta .Acesta este un exemplu de cod de cum ai oferi parametri pentru a ViewModel folosind Manerul :

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

Am depanat aplicația de codelab. E constructor este numit, chiar dacă eu nu-l trece orice fabrică. Cum este posibil? Cine trece SavedStateHandle la constructor?
Neeraja Gandla

Puteți partaja link-ul de la aplicația ? Ai rula aplicația la nivel local pe Android Studio ? Pentru că github link-ul de la codul menționat în codelab menționează unele usecases și soluționarea lor , nu există nici o soluție cu drepturi depline ca o aplicație completă
Karunesh Palekar

Puteți descărca codul sursă de aici: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

De asemenea, vă rugăm să căutați în secțiunea de Editare de întrebare
Neeraja Gandla

Fericit că mi-ai răspuns .
Karunesh Palekar

Poti sa detaliezi mai mult pe editare ? Eu nu sunt obtinerea conținutul exact ce vrei să știi . ViewModel oferă funcționalități suplimentare de cache datele pentru orientarea ecranului , astfel încât să ofere aceste funcționalități , dezvoltatorii au trebuit să găsească o cale , în care aceasta a fost una au aflat . Noi toți dezvoltatorii android trebuie să treacă printr-o astfel de cazuri multe în cariera noastră, sper ca ai inteles
Karunesh Palekar

Neeraja Gandla

În alte limbi

Această pagină este în alte limbi

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