2

Ich versuche, die neuen Architekturkomponenten in Android zu verwenden, und bisher hat es ziemlich gut funktioniert. Ich bin jedoch auf ein architektonisches Problem gestoßen.Android Architektur Komponenten ViewModel Kontext Problem

Ich habe eine MainActivity die eine Reihe von Fragmenten beherbergt, A, B und C. Bis jetzt, jedes Mal, wenn ich mein ViewModel (VM) brauche, hole ich es im Kontext von MainActivity (so: MyViewModel vm = ViewModelProviders.of(getActivity()).get(MyViewModel.class);). Betrachten wir nun das:

  • Fragment C kann der Benutzer einen Wert aus, und schreibt sie in den VM.
  • Fragment A verwendet Fragment C, damit der Benutzer den Wert auswählt, und dann A liest den Wert direkt von VM und zeigt es in seiner Benutzeroberfläche an.
  • Fragment B verwendet den gleichen Ansatz wie Fragment A.

Das Problem ist, dass, da die VM immer im Kontext der MainActivity ist, wenn Fragment A hat vor B verwendet wurde, noch der Wert verfügbar sein wird, und B wird einige alten Daten zeigen.

Die offensichtlichste Lösung, die ich sehe, ist das Erstellen der VM in den Kontexten der Fragmente A bzw. B. Aber dann kann ich nicht herausfinden, wie man C auf diese VM s fragment lassen lassen.

konnte ich die VM im Rahmen des Fragments schaffen auch C, aber das würde Fragmente A und B erfordern eine Instanz von C zu schaffen, das glaube ich nicht eine schöne Lösung.

Eine dritte Lösung wäre, den aktuellen Ansatz beizubehalten und die Daten in der VM wenn angemessen zu löschen, aber das ist auch chaotisch, denke ich.

Was ist der beste Weg, dies zu tun?

Antwort

0

Sie können eine Zuordnung in VM erstellen und die Werte für A und B unter verschiedenen Schlüsseln speichern.

Also, wenn A startet C es übergibt seine A_key als Argument. Wenn der Benutzer einen Wert in C auswählt, wird er in der Map der VM unter Verwendung von A_key als Schlüssel gespeichert. Wenn A prüft, ob ein Wert verfügbar ist, wird nur der für A_key gespeicherte Wert überprüft.

Das gleiche für B und B_key.

+0

Solch eine einfache Lösung - danke! –