2014-07-03 11 views
5

Sto scrivendo un'app multipiattaforma per iOS e Android utilizzando MvvmCross.Gestione corretta delle modifiche di configurazione

La versione Android utilizza frammenti nidificati. Ad esempio, la vista home è un cassetto di navigazione, le sue varie visualizzazioni di hub di navigazione sono frammenti che possono essere viste divise contenenti altri frammenti e, in aggiunta, ciascuna vista può mostrare anche un frammento di finestra di dialogo.

Inoltre, non tutti i ViewModels vengono visualizzati tramite ShowViewModel(), alcuni di essi vengono utilizzati più come provider di eventi PropertyChanged come dimostrato nello N=32 video.

Questo funziona correttamente fino a quando non si verifica una modifica della configurazione (in genere, la rotazione del dispositivo). Quando le viste frammento vengono ricreate, i loro modelli di vista non sono e sono impostati su null. Questo è suggerito nel seguente MvvmCross issue #636, dove Stuart menziona anche che vorrebbe che il progetto fornisse alcuni consigli sulle migliori pratiche.

La mia domanda ora è quali sono le migliori pratiche per questo? Che cosa fai se devi supportare correttamente le modifiche alla configurazione di Android in MvvmCross?

Ho provato a risolvere il problema come descritto nel problema collegato sopra, ad esempio da qualche forma di registro ViewModel nel ViewModels padre, e anche provando a serializzare il Frammento ViewModel quando si salva il suo stato di istanza, con successo limitato . I risultati si sono rivelati migliori al massimo. Il problema rimane che un frammento non sa come ricreare il suo modello di vista in MvvmCross. Oh, e la disabilitazione delle modifiche alla configurazione sulla rotazione del dispositivo non conta come risposta. ;-)

risposta

0

Ovviamente questa risposta non è una risposta diretta alla tua domanda, ma ritengo che sia abbastanza simile da menzionare qui.

Nelle mie Applicazioni Android ho cominciato a iniettare un Controller (o MVA stile Adapter) in un View/Fragment/Activity utilizzando la libreria Injection Dagger Dipendenza. Questo ha la proprietà cruciale di mantenere l'istanza della classe Controller, quindi su cambio rotazione/configurazione lo stesso Controller viene reiniettato.

Sembra che Mvx.Resolve() dovrebbe essere in grado di eseguire questo idealmente, o avrete un brutto momento. Se non introduce una cache di livello intermedio tra le classi di visualizzazione e la classe Mvx sembra l'unica opzione per me. Ma questa è la mia prima ora di lettura di Xamarin, quindi potrei non essere nel segno. Sono stato un dev di Android per 5 anni ora, anche se così ho pensato di aggiungere il mio 2 pence :)