Cómo administrar y actualizar GlanceAppWidget

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.