Gestisci e aggiorna GlanceAppWidget

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.