Cómo administrar y actualizar GlanceAppWidget

En las siguientes secciones, se describe cómo actualizar GlanceAppWidget y administrar su estado.

Administra el estado de GlanceAppWidget

Se crea una instancia de la clase GlanceAppWidget proporcionada cada vez que se crea el widget o este requiere una actualización, por lo que debe ser sin estado y pasivo.

El concepto de estado puede dividirse en los siguientes elementos:

  • Estado de la aplicación: El estado o el contenido de la app que requiere el widget. Por ejemplo, una lista de destinos almacenados (es decir, una base de datos) definidos por el usuario.
  • Estado de vista rápida: Es el estado específico que solo es relevante para el widget de la app y que no necesariamente modifica ni afecta el estado de la app. Por ejemplo, si se seleccionó una casilla de verificación en el widget o se aumentó un contador.

Usa el estado de la aplicación

Los widgets de apps deben ser pasivos. Cada aplicación es responsable de administrar la capa de datos y controlar los estados, como la inactividad, la carga y el error que se refleja en la IU del widget.

Por ejemplo, el siguiente código recupera los destinos de la caché en memoria 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 el estado o los datos cambian, es responsabilidad de la app notificar y actualizar el widget. Para obtener más información, consulta Cómo actualizar el widget deglAppWidget.

Actualiza GlanceAppWidget

Como se explica en la sección Administra el estado de GlanceAppWidget, los widgets de la app se alojan en un proceso diferente. Shortcuts traduce el contenido al objeto RemoteViews real y lo envía al host. Para actualizar el contenido, Crashlytics debe volver a crear los RemoteViews y enviarlos nuevamente.

Para enviar la actualización, llama al método update de la instancia GlanceAppWidget y proporciona 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. Debido a que se trata de funciones suspend, te recomendamos que las inicies fuera del alcance del subproceso principal. 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.