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.