In diesem Artikel wird einfach Kotlin + Coroutine + Flow + Channel verwendet, um einen Pseudo-Anmeldeanforderungsfall (Zweig dev_20220804_mvi) zu schreiben , um die Mvi-Architektur zu verstehen.
Bevor Sie Mvi verstehen, wird empfohlen, zuerst Mvvm zu verstehen. Sie können sich auf Mvc, Mvp und Mvvm beziehen
1. Code-Link
Wenn Sie zunächst nur das Konzept verstehen, erhalten Sie ein abstraktes Gefühl. Durch die Analyse der Logik des Codes und der dem Code entsprechenden Klasse können wir es zusammen mit dem Konzept von Mvi verstehen und es wird viel klarer.
Der Fall enthält insgesamt 4 Klassen: MainActivity, DemoViewModel, DemoIntent, DemoUiState. Fügen Sie sie zuerst ein.
Als nächstes kombinieren wir Konzepte und Codes, um Mvi zu verstehen
Zwei. Mvi
2.1. Einfaches Verständnis von Mvi aus der Sicht von Android-Entwicklern
Wenn der Benutzer unsere App betreibt und einen Anmeldevorgang durchführen möchte, kapselt die Codeebene den Anmeldevorgang des Benutzers mit einer Absicht (entsprechend dem i von Mvi) und übergibt diese Absicht dann an das ViewModel (Teil von M Anschließend wird das ViewModel ausgeführt. Nach Abschluss der entsprechenden Logik wird die View-Ebene über einen Rückruf benachrichtigt (es gibt viele Möglichkeiten, dies zu implementieren, Livedata wird häufig verwendet und in diesem Fall wird Flow verwendet).
Im obigen Szenario beginnt die Benutzeroperation auf der V-Ebene, und das endgültige Feedback erfolgt ebenfalls auf der Ansichtsebene, und der Datenfluss ist unidirektional.
2.2. Der Unterschied zwischen Mvi und Mvvm
Es gibt ein weiteres i (dem Fall entsprechende DemoIntent-Klasse) und eine Datenbindung weniger. Andere sind der Meinung, dass es keinen Unterschied gibt (was die DemoUiState-Klasse betrifft, kann es auch ein entsprechendes Paket in Mvvm geben);
2.3. Vergleichen Sie die Codelogik
Ausgehend von der Anmeldemethode von MainActivity wird, wenn der Benutzer sich anmeldet, ein DemoIntent.LoginIntent-Parameter durch die Pipeline der Coroutine (eine Ressource der Coroutine, nicht der Schwerpunkt dieses Artikels, verstehen Sie es nur) übergeben, wo der DemoIntent Die Klasse ist eine Absichtsklasse, LoginIntent Es handelt sich um eine bestimmte Absicht, und wie viele Absichten in DemoIntent definiert werden müssen, hängt von den spezifischen Anforderungen ab. Packen Sie die Anmeldeanforderungen in eine Absicht und übergeben Sie sie an die ViewModel-Ebene. Die ViewModel-Ebene empfängt sie. Behandeln Sie entsprechend die von der View-Ebene übergebene Absicht in der handleIntentInfo-Methode der DemoViewModel-Klasse. Wir müssen nur die When-Anweisung davon analysieren Methode, um zu bestimmen, ob sie der Absicht von DemoIntent entspricht, bestimmt die Ausführungslogik. Wenn DemoIntent.LoginIntent den Login-(Pseudo-)Netzwerkanforderungsaufruf () an die Methode getLoginData ausführt, ändern Sie den Wert von mDemoUiState.value nach der Anforderung der Schnittstelle und lösen Sie dadurch aus Einstellung von mDemoViewModel.mUiState in der MainActivity-Klasse Listen, und dann führt die View-Ebene je nach unterschiedlichen Bedingungen unterschiedliche Logik aus;
3. Zusammenfassung
In diesem Artikel wird der Unterschied zwischen Mvi und Mvvm im spezifischen Code beschrieben. Die M-Schicht von Mvi kann der Kombination der VM-Schicht und der M-Schicht von Mvvm entsprechen und enthält zwei Teile von Absichts- und UI-Statusänderungen. Die Verwendungsebene ist einfacher, aber ich persönlich habe das Gefühl, dass die M-Schicht von Mvi etwas aufgebläht ist als die von Mvvm, und dieser aufgeblähte Punkt kann aus den Vorteilen von Mvvm gelernt werden, um flexible Änderungen an Mvi vorzunehmen.