Saltar al contenido principal

Restaurar el estado en Android

Cómo restaurar el estado de tu aplicación de Android después de que haya sido finalizada por el sistema operativo.

Cuando un usuario ejecuta una aplicación móvil y luego selecciona otra aplicación para ejecutar, la primera aplicación se mueve a segundo plano, o se envía a segundo plano. El sistema operativo (tanto iOS como Android) podría finalizar la aplicación en segundo plano para liberar memoria y mejorar el rendimiento de la aplicación que se ejecuta en primer plano.

Cuando el usuario vuelve a seleccionar la aplicación, llevándola de nuevo a primer plano, el SO la vuelve a iniciar. Pero, a menos que hayas configurado una forma de guardar el estado de la aplicación antes de que fuera finalizada, habrás perdido el estado y la aplicación se iniciará desde cero. El usuario habrá perdido la continuidad que espera, lo cual claramente no es ideal. (Imagina completar un formulario largo y ser interrumpido por una llamada telefónica antes de hacer clic en Enviar.)

Entonces, ¿cómo puedes restaurar el estado de la aplicación para que se vea como antes de ser enviada a segundo plano?

Flutter tiene una solución para esto con el RestorationManager (y clases relacionadas) en la librería services. Con el RestorationManager, el framework de Flutter proporciona los datos de estado al motor a medida que el estado cambia, de modo que la aplicación esté lista cuando el SO señale que está a punto de finalizar la aplicación, dándole a la aplicación solo unos momentos para prepararse.

Resumen

#

Puedes habilitar la restauración de estado con solo unas pocas tareas:

  1. Define un restorationScopeId para clases como CupertinoApp, MaterialApp o WidgetsApp.

  2. Define un restorationId para widgets que lo soporten, como TextField y ScrollView. Esto habilita automáticamente la restauración de estado incorporada para esos widgets.

  3. Para widgets personalizados, debes decidir qué estado deseas restaurar y mantener ese estado en una RestorableProperty. (La API de Flutter proporciona varias subclases para diferentes tipos de datos). Define esos widgets RestorableProperty en una clase State que use el RestorationMixin. Registra esos widgets con el mixin en un método restoreState.

  4. Si usas alguna API de Navigator (como push, pushNamed, etc.), migra a la API que tenga "restorable" en el nombre (restorablePush, restorablePushNamed, etc.) para restaurar la pila de navegación.

Otras consideraciones:

  • Proporcionar un restorationScopeId a MaterialApp, CupertinoApp o WidgetsApp habilita automáticamente la restauración de estado al inyectar un RootRestorationScope. Si necesitas restaurar el estado por encima de la clase de la aplicación, inyecta un RootRestorationScope manualmente.

  • La diferencia entre un restorationId y un restorationScopeId: Los widgets que reciben un restorationScopeId crean un nuevo restorationScope (un nuevo RestorationBucket) en el cual todos los hijos almacenan su estado. Un restorationId significa que el widget (y sus hijos) almacenan los datos en el bucket circundante.

Restaurar el estado de navegación

#

Si deseas que tu aplicación regrese a una ruta particular que el usuario estaba viendo recientemente (el carrito de compras, por ejemplo), entonces también debes implementar la restauración de estado para la navegación.

Si usas la API de Navigator directamente, migra los métodos estándar a métodos restorable (que tienen "restorable" en el nombre). Por ejemplo, reemplaza push con restorablePush.

Probar la restauración de estado

#

Para probar la restauración de estado, configura tu dispositivo móvil para que no guarde el estado una vez que la aplicación se envíe a segundo plano. Para aprender cómo hacer esto tanto en iOS como en Android, consulta Probar la restauración de estado en la página de RestorationManager.

Otros recursos

#

Para obtener más información sobre la restauración de estado, consulta los siguientes recursos.