Les sections suivantes décrivent comment mettre à jour GlanceAppWidget
et gérer son é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. Elle doit donc être sans état et passive.
Le concept d'état peut être divisé comme suit:
- Application state (État de l'application) : état ou contenu de l'application requis par le widget. 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: état spécifique qui n'est pertinent que pour le widget de l'application et qui ne modifie pas nécessairement l'état de l'application. Par exemple, une case a été cochée dans le widget ou un compteur a été augmenté.
Utiliser l'état de l'application
Les widgets d'application doivent être passifs. Chaque application est responsable de la gestion de la couche de données et des états, tels que "Inactif", "Chargement" et "Répercussion d'erreur" dans l'UI du widget.
Par exemple, le code suivant récupère les destinations du cache en mémoire à partir de la couche de dépôt, fournit la liste stockée des destinations et 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, il est de la responsabilité de l'application d'avertir et de mettre à jour le widget. Pour en savoir plus, consultez la section Mettre à jour GlanceAppWidget.
Mettre à jour GlanceAppWidget
Comme expliqué dans la section Gérer l'état de GlanceAppWidget
, les widgets d'application sont hébergés dans un processus différent. Glance traduit le contenu en RemoteViews
réel et l'envoie à l'hôte. Pour mettre à jour le contenu, Glance doit recréer les RemoteViews
, puis les renvoyer.
Pour envoyer la mise à jour, appelez la méthode update
de l'instance GlanceAppWidget
, en fournissant les attributs context
et glanceId
:
MyAppWidget().update(context, glanceId)
Pour obtenir 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. Comme il s'agit de fonctions suspend
, nous vous recommandons de les lancer en dehors du champ d'application du thread principal. 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 la page Coroutines Kotlin sur Android.