Komunikacija između fragmenata pomoću zajedničkog ViewModela u Androidu

  • Shared ViewModel omogućuje više fragmenata pristup jednoj instanci podataka povezanoj sa životnim ciklusom aktivnosti.
  • Korištenje LiveData i Transformacija omogućuje reaktivno i automatsko ažuriranje korisničkog sučelja kao odgovor na promjene stanja.
  • Ova arhitektura odvaja UI komponente, eliminirajući potrebu za složenim sučeljima ili izravnim referencama između fragmenata.

Kako funkcionira dijeljeni model prikaza

Ako ste se ikada mučili s time da jedan dio sustava zna što se dogodilo u drugom, znate da prijenos podataka u Androidu može biti prava glavobolja. Kada imate aplikaciju s nekoliko međusobno ovisnih zaslona, sinkronizacija informacija Ključno je kako korisnik ne bi imao osjećaj da je aplikacija pokvarena ili da podaci nestaju kada se zaslon rotira.

Najrobustnije i najmodernije rješenje koje imamo na raspolaganju je Dijeljeni model prikazaU osnovi, to je spremište podataka koje ne pripada niti jednom fragmentu, već je vezano uz aktivnost koja ih sve sadrži. Na taj način, bilo koji zaslon može čitati ili pisati informacije bez potrebe da zna za ostale, održavajući kod čistim i sprječavajući rušenje aplikacije zbog pogrešaka. promjene konfiguracije.

Što je točno dijeljeni ViewModel?

Jednostavno rečeno, ViewModel je klasa dizajnirana za pohranu i upravljanje podacima vezanim uz korisničko sučelje. Kada kažemo da je podijeljenPod "opsegom" mislimo da je njegov opseg aktivnost domaćina. Sve dok je aktivnost aktivna, ViewModel će postojati, što znači da ako korisnik navigira između fragmenata, svi će gledati isti "okvir s podacima".

Ova arhitektura je dragulj u kruni jer potpuno odvojiti fragmenteViše ne morate stvarati komplicirana sučelja ili prosljeđivati ​​beskonačne pakete kao argumente. Fragment A pohranjuje podatke, ViewModel ih zadržava, a fragment B ih promatra i reagira na njih. To je, jednostavno rečeno, najučinkovitiji način da se izbjegne curenje memorije i pogreške životni ciklus aktivnosti.

Postupna implementacija i najbolje prakse

Za postavljanje ovog sustava, prvi korak je stvaranje klase koja nasljeđuje od ViewModelUnutar toga, idealno je ne izlagati varijable izravno. Zlatno pravilo je koristiti MutableLiveData privatno (na primjer, s podcrtom) _quantity) i izložiti verziju samo za čitanje pomoću LiveDataTo sprječava bilo koju vanjsku klasu da po volji mijenja podatke i uzrokuje nepravilno ponašanje.

Model-Prikaz-PrikazModel
Povezani članak:
Potpuni vodič za savladavanje arhitektonskog obrasca MVVM

Tajna opsega

Ovdje mnogi ljudi griješe. Ako koristite delegiranje viewModels()Svaki fragment će imati svoju instancu i neće biti komunikacije. Da biste ga dijelili, morate koristiti activityViewModels() ili proslijediti aktivnost konstruktoru ViewModelProviderIzradom Vlasnik ViewModela Bez obzira na aktivnost, osiguravate da svi fragmenti prime istu instancu.

Reaktivna sinkronizacija s LiveData i Data Bindingom

Prava magija se događa kada kombiniramo ViewModel s Povezivanje podatakaUmjesto pisanja repetitivnog koda za ažuriranje svakog TextView-a, možemo izravno povezati varijablu ViewModel u XML-u. Da bi ovo funkcioniralo, bitno je dodijeliti Vlasnik životnog ciklusa u fragmentu; inače, sučelje neće znati da su se podaci promijenili i ostat ćete gledati u statični ekran.

Napredne tehnike: Transformacije i rezultati

Ponekad ne želimo prikazati sirove podatke, već formatiranu verziju. Za to postoje... Transformacije LiveDataNa primjer, ako imamo cijenu kao decimalni broj, možemo koristiti Transformations.map() da ga automatski pretvori u tekstualni niz sa simbolom lokalne valute. To omogućuje logika prezentacije nalaze se u ViewModelu i ne zatrpavaju klasu fragmenata.

Alternativa: API za rezultate fragmenata

Ne treba nam uvijek ViewModel. Ako želimo proslijediti samo jedan, specifičan dio podataka (poput rezultata skeniranja QR koda), API rezultata fragmenta To je najlakša opcija. Ovaj alat koristi FragmentManager poput središnjeg poštanskog sandučića: jedan fragment uspostavlja rezultat određenim ključem, a prijemni fragment ga sluša putem slušalacIdealan je za brzu, jednosmjernu komunikaciju koja ne zahtijeva upornost.

Primjeri upotrebe i arhitektura u stvarnom svijetu

Zamislite ekran za narudžbu kolačića. U prvom koraku birate količinu, u drugom okus, a u trećem datum preuzimanja. Zahvaljujući Shared ViewModelu, ekran sažetka može pristupiti sve prethodne odluke bez da prethodni fragmenti moraju išta eksplicitno slati. Možemo čak izračunati ukupna cijena u stvarnom vremenu Dodavanje dodatnih troškova ako korisnik odluči preuzeti narudžbu isti dan.

Asinkroni i reaktivni tokovi podataka s Kotlin Flowom
Povezani članak:
Potpuni vodič za bitne Kotlin koncepte za Android razvoj

Drugi tipičan scenarij je prikaz glavnog i detaljnog prikaza na tabletima. Kada dodirnete stavku na popisu u lijevom fragmentu, ViewModel se ažurira, a desni fragment, koji pregledava iste podatke, Osvježi detaljne informacije Trenutno. Sve se to događa bez potrebe da aktivnost aktivno intervenira u koordinaciji, jednostavno funkcionirajući kao spremnik koji održava stanje živim. Podijelite ovaj vodič i više korisnika će biti informirano o temi.


Dodaj kao preferirani izvor