Gérer et mettre à jour GlanceAppWidget

Les sections suivantes expliquent comment mettre à jour GlanceAppWidget et gérer ses de l'état.

Gérer l'état de GlanceAppWidget

La classe GlanceAppWidget fournie est instanciée chaque fois que le widget est créé ou nécessite une mise à jour, il doit donc être sans état et passif.

Le concept d'état peut être divisé en plusieurs parties:

  • État de l'application: état ou contenu de l'application requis par le . Par exemple, une liste de destinations stockées (c'est-à-dire une base de données) définies par l'utilisateur.
  • État de l'aperçu: l'état spécifique qui n'est pertinent que pour le widget de l'application. et ne modifie pas nécessairement l'état de l'application. Par exemple, un a été cochée dans le widget, ou le compteur a été augmenté.

Utiliser l'état de l'application

Les widgets d'application doivent être passifs. Chaque application est chargée de gérer couche de données et gestion des états, tels que l'inactivité, le chargement et la réflexion des erreurs dans l'UI du widget.

Par exemple, le code suivant récupère les destinations de l'instance de la couche du dépôt, fournit la liste stockée des destinations affiche une interface utilisateur différente en fonction de son état:

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
            }
        }
    }
}

Chaque fois que l'état ou les données changent, l'application doit avertir et mettez à jour le widget. Pour en savoir plus, consultez Mettre à jour GlanceAppWidget.

Mettre à jour GlanceAppWidget

Comme expliqué dans la section Gérer l'état GlanceAppWidget, l'application les widgets sont hébergés dans un processus différent. Glance traduit le contenu en RemoteViews réel et les envoie à l'hôte. Pour mettre à jour le contenu, Glance doit recréer les RemoteViews et les renvoyer.

Pour envoyer la mise à jour, appelez la méthode update de l'instance GlanceAppWidget. en fournissant les éléments context et glanceId:

MyAppWidget().update(context, glanceId)

Pour obtenir le glanceId, interrogez GlanceAppWidgetManager:

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

Vous pouvez également utiliser l'une des extensions 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
}

Ces méthodes peuvent être appelées à partir de n'importe quelle partie de votre application. Parce qu’il s’agit suspend fonctions, nous vous recommandons de les lancer en dehors du thread principal le champ d'application. Dans l'exemple suivant, elles sont lancées dans 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()
    }
}

Pour en savoir plus sur les coroutines, consultez Coroutines Kotlin sur Android.