Le seguenti sezioni descrivono come aggiornare GlanceAppWidget
e gestirne
stato.
Gestisci lo stato di GlanceAppWidget
Viene creata un'istanza della classe GlanceAppWidget
fornita ogni volta che il widget
creato o richiede un aggiornamento, quindi deve essere stateless e passivo.
Il concetto di stato può essere suddiviso come segue:
- Stato applicazione: lo stato o i contenuti dell'app richiesti dalla widget. Ad esempio, un elenco di destinazioni archiviate (ad es. database) definite per l'utente.
- Stato panoramica: lo stato specifico pertinente solo per il widget dell'app. e non modificano o condizionano necessariamente lo stato dell'app. Ad esempio, un è stata selezionata nel widget o è stato aumentato un contatore.
Utilizza stato applicazione
I widget delle app devono essere passivi. Ogni applicazione è responsabile della gestione livello dati e la gestione degli stati, ad esempio inattivo, in caricamento e riflesso degli errori nell'interfaccia utente del widget.
Ad esempio, il codice che segue recupera le destinazioni dall'elenco Cache dal livello di repository, fornisce l'elenco di destinazioni archiviato e mostra una UI diversa a seconda del suo stato:
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 } } } }
Ogni volta che lo stato o i dati cambiano, è responsabilità dell'app informare e aggiornare il widget. Per ulteriori informazioni, vedi Aggiornamento dell'app GlanceAppWidget.
Aggiorna GlanceAppWidget
Come spiegato nella sezione Gestire lo stato di GlanceAppWidget
,
i widget sono ospitati in un processo diverso. Il Riepilogo traduce i contenuti in
RemoteViews
effettivo e li invia all'host. Per aggiornare i contenuti, Riepilogo
deve ricreare il RemoteViews
e inviarlo di nuovo.
Per inviare l'aggiornamento, chiama il metodo update
dell'istanza GlanceAppWidget
,
fornendo i context
e i glanceId
:
MyAppWidget().update(context, glanceId)
Per ottenere glanceId
, esegui una query su GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
In alternativa, utilizza una delle estensioni 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 }
Questi metodi possono essere chiamati da qualsiasi parte dell'applicazione. Perché sono
suspend
funzioni, ti consigliamo di lanciarle al di fuori del thread principale
l'ambito di attività. Nell'esempio seguente, sono state lanciate in 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() } }
Per ulteriori informazioni sulle coroutine, vedi Kotlin Coroutines su Android.