En las siguientes secciones, se describe cómo actualizar GlanceAppWidget
y administrar su
para cada estado.
Administra el estado de GlanceAppWidget
Se crea una instancia de la clase GlanceAppWidget
proporcionada cada vez que se crea el widget
creado o requiere una actualización, por lo que debe ser sin estado y pasivo.
El concepto de estado se puede dividir en lo siguiente:
- Estado de la aplicación: El estado o contenido de la aplicación que requiere la widget. Por ejemplo, una lista de destinos almacenados (es decir, una base de datos) definida por del usuario.
- Estado de vista previa: El estado específico que solo es relevante para el widget de la app y no necesariamente modifica ni afecta el estado de la app. Por ejemplo, un se seleccionó la casilla de verificación en el widget o se aumentó un contador.
Usa el estado de la aplicación
Los widgets de las apps deben ser pasivos. Cada aplicación es responsable de administrar el capa de datos y el manejo de los estados, como inactivo, cargando y reflejando errores en la IU del widget.
Por ejemplo, el siguiente código recupera los destinos del archivo caché desde la capa del repositorio, proporciona la lista almacenada de destinos y muestra una IU diferente según su estado:
class DestinationAppWidget : GlanceAppWidget() { // ... @Composable fun MyContent() { val repository = remember { DestinationsRepository.getInstance() } // Retrieve the cache data everytime the content is refreshed val destinations by repository.destinations.collectAsState(State.Loading) when (destinations) { is State.Loading -> { // show loading content } is State.Error -> { // show widget error content } is State.Completed -> { // show the list of destinations } } } }
Cuando cambian el estado o los datos, es responsabilidad de la app notificar y actualiza el widget. Consulta Cómo actualizar GlanceAppWidget para obtener más información.
Actualizar GlanceAppWidget
Como se explica en la sección Cómo administrar el estado GlanceAppWidget
, la app
los widgets se alojan en un proceso diferente. Vista rápida traduce el contenido en
RemoteViews
real y las envía al host. Para actualizar el contenido, presiona un vistazo
debes volver a crear las RemoteViews
y enviarlas de nuevo.
Para enviar la actualización, llama al método update
de la instancia GlanceAppWidget
.
Proporcionar context
y glanceId
:
MyAppWidget().update(context, glanceId)
Para obtener el glanceId
, consulta el GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
También puedes usar una de las extensiones GlanceAppWidget update
:
// Updates all placed instances of MyAppWidget MyAppWidget().updateAll(context) // Iterate over all placed instances of MyAppWidget and update if the state of // the instance matches the given predicate MyAppWidget().updateIf<State>(context) { state -> state == State.Completed }
Se puede llamar a estos métodos desde cualquier parte de tu aplicación. Porque son
suspend
, te recomendamos que las inicies fuera del subproceso principal
del proyecto. En el siguiente ejemplo, se inician en un CoroutineWorker
:
class DataSyncWorker( val context: Context, val params: WorkerParameters, ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { // Fetch data or do some work and then update all instance of your widget MyAppWidget().updateAll(context) return Result.success() } }
Consulta Corrutinas de Kotlin en Android para obtener más detalles sobre las corrutinas.