Gerenciar e atualizar o GlanceAppWidget

As seções a seguir descrevem como atualizar o GlanceAppWidget e gerenciar o estado.

Gerenciar o estado do GlanceAppWidget

A classe GlanceAppWidget fornecida é instanciada sempre que o widget é criou ou exige atualização, então ele precisa ser sem estado e passivo.

O conceito de estado pode ser dividido no seguinte:

  • Estado do aplicativo: o estado ou conteúdo do app que é exigido pelo widget. Por exemplo, uma lista de destinos armazenados (ou seja, banco de dados) definida pelo o usuário.
  • Estado de resumo: o estado específico que só é relevante para o widget de app. e não necessariamente modifica nem afeta o estado do app. Por exemplo, caixa de seleção foi marcada no widget ou um contador foi aumentado.

Usar o estado do aplicativo

Os widgets de apps precisam ser passivos. Cada aplicativo é responsável por gerenciar camada de dados e processar os estados, como inatividade, carregamento e reflexão de erro. na interface do widget.

Por exemplo, o código a seguir recupera os destinos do recurso cache da camada de repositório, fornece a lista armazenada de destinos e exibe uma interface diferente, dependendo do 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
            }
        }
    }
}

Sempre que o estado ou os dados mudam, é responsabilidade do app notificar e atualizar o widget. Consulte Atualizar GlanceAppWidget para mais informações.

Atualize o GlanceAppWidget.

Como explicado na seção Gerenciar o estado do GlanceAppWidget, o app os widgets são hospedados em um processo diferente. O Glance traduz o conteúdo para RemoteViews real e as envia ao host. Para atualizar o conteúdo, o Resumo precisa recriar a RemoteViews e enviá-las novamente.

Para enviar a atualização, chame o método update da instância GlanceAppWidget, fornecendo o context e o glanceId:

MyAppWidget().update(context, glanceId)

Para acessar o glanceId, consulte o GlanceAppWidgetManager:

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

Como alternativa, use uma das extensões 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
}

É possível chamar esses métodos em qualquer parte do aplicativo. Como elas são suspend, recomendamos iniciá-las fora da linha de execução principal do projeto. No exemplo abaixo, eles são iniciados em um 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()
    }
}

Consulte Corrotinas do Kotlin no Android para mais detalhes sobre corrotinas.