2017-08-20 2 views
3

Ich versuche, mich mit den neuen Komponenten der Android-Architektur, insbesondere dem ViewModel, zu beschäftigen.Wie kann ich ViewModels richtig skalieren?

Mein Eindruck ist, dass ein Fragment nicht wissen sollte, welcher Aktivität oder Fragment es gehört, so dass es in verschiedenen Kontexten der Anwendung verwendet werden kann. Die Beispiele scheinen dies zu widersprechen, indem Sie den Ansichtsmodell Umfang direkt im Fragment erklärt, anstatt das Fragment Besitzer:

viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class); 

Ich mag würde dieses Fragment in einer Master/Detail-Konfiguration in der Lage sein zu verwenden, wobei beide teilen die gleicher Status (dh ViewModel-Instanz) sowie innerhalb eines ViewPagers, wo alle Fragmente einen separaten Status benötigen (dh separate ViewModel-Instanzen). Ich würde erwarten, dass der Besitzer des Fragments den Umfang diktiert, was mit diesem Ansatz nicht unterstützt zu werden scheint. falls notwendig (beispielsweise im Master/Detailkonfiguration)

Eine Abhilfe kam ich mit könnte Durchlauf in einem konfigurierten ViewModelProvider optional sein, explizit den Umfang eines Ansichtsmodell zu erweitern und zu separaten Viewmodels standardmäßig haben:

final ViewModelProvider viewModelProvider; 
if (viewModelProviderOverride != null) { 
    viewModelProvider = viewModelProviderOverride; 
} else { 
    viewModelProvider = ViewModelProviders.of(this); 
} 

viewModel = viewModelProvider.get(SomeViewModel.class); 

Auf diese Weise kann der Besitzer entscheiden, ob mehrere Fragmente ihren Status teilen oder nicht. Ich habe das noch nicht ganz durchdacht, aber es scheint etwas fischig zu sein, da nichts in der Nähe davon in den Dokumenten angedeutet zu sein scheint. Ich habe das Gefühl, dass mir etwas offensichtlich fehlt.

+0

Sie wollen verschiedene 'ViewModel's für verschiedene 'Fragment' Instanzen? dann benutze 'ViewModelProvider # get (String key, Klasse modelClass)' – pskink

+0

@pskink Ich bin vielleicht etwas unklar gewesen, tut mir leid. Mein Problem ist, dass 'ViewModelProviders.of (getActivity())' im Fragment es mit der übergeordneten Aktivität verbindet und die Verwendung des Fragments in einer eigenständigen Weise (d. H. 'ViewModelProviders.of (this)') an anderen Stellen verhindert. Ich frage mich, ob das Fragment derjenige sein sollte, der darüber entscheidet, wem der Staat gehört, mit dem es arbeitet. Es scheint mir, dass der Eigentümer des Fragments (entweder die enthaltende Aktivität oder ein anderes Elternfragment) für diese Wahl verantwortlich sein sollte. Klärt das Dinge? – jwueller

+0

Nun, 'ViewModelProviders # of' Methoden sind nur Dienstprogramme, die in den meisten Fällen verwendet werden können, wenn Sie mehr Kontrolle benötigen, können Sie immer einen von zwei 'ViewModelProvider' Konstruktoren verwenden, die' ViewModelStoreOwner' Schnittstelle übergeben (zum Beispiel implementiert von ' Application 'oder Singleton) oder' ViewModelStore' direkt, wenn Sie einen haben, der Nachteil davon ist, dass Sie 'ViewModelProvider.Factory' übergeben müssen, aber hier können Sie einen der vorhandenen 'ViewModelProvider.NewInstanceFactory' oder' ViewModelProviders.DefaultFactory' verwenden – pskink

Antwort

0

Sagen viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class); bedeutet, dass Sie möchten, dass der Status ViewModel auf die Aktivität beschränkt ist. Wenn Sie nicht möchten, dass das Fragment auf die Aktivität beschränkt wird, rufen Sie einfach viewModel = ViewModelProviders.of(this).get(SomeViewModel.class); an. Jetzt ist alles, was Sie tun, if (shareState) dann rufen Sie die erste und wenn nicht die zweite anrufen.

Verwandte Themen