В следующих разделах описано, как обновить GlanceAppWidget
и управлять его состоянием.
Управление состоянием GlanceAppWidget
Предоставленный класс GlanceAppWidget
создается всякий раз, когда виджет создается или требует обновления, поэтому он должен быть пассивным и без сохранения состояния .
Понятие государства можно разделить на:
- Состояние приложения : состояние или содержимое приложения, которое требуется виджету. Например, список сохраненных мест назначения (т. е. база данных), определенный пользователем.
- Состояние просмотра : конкретное состояние, которое относится только к виджету приложения и не обязательно изменяет или влияет на состояние приложения. Например, в виджете был установлен флажок или увеличен счетчик.
Использовать состояние приложения
Виджеты приложений должны быть пассивными. Каждое приложение отвечает за управление уровнем данных и обработку таких состояний, как бездействие, загрузка и ошибки, которые отражаются в пользовательском интерфейсе виджета.
Например, следующий код извлекает пункты назначения из кэша в памяти уровня репозитория, предоставляет сохраненный список пунктов назначения и отображает другой пользовательский интерфейс в зависимости от его состояния:
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 } } } }
Всякий раз, когда состояние или данные изменяются, приложение обязано уведомить и обновить виджет. Дополнительную информацию см. в разделе «Обновление GlanceAppWidget» .
Обновить GlanceAppWidget
Как поясняется в разделе «Управление состоянием GlanceAppWidget
, виджеты приложения размещаются в другом процессе. Glance преобразует контент в реальные RemoteViews
и отправляет их на хост. Чтобы обновить содержимое, Glance должен заново создать RemoteViews
и отправить их снова.
Чтобы отправить обновление, вызовите метод update
экземпляра GlanceAppWidget
, предоставив context
и glanceId
:
MyAppWidget().update(context, glanceId)
Чтобы получить glanceId
, запросите GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
Альтернативно используйте одно из расширений 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 }
Эти методы можно вызывать из любой части вашего приложения. Поскольку это функции suspend
, мы рекомендуем запускать их за пределами области действия основного потока. В следующем примере они запускаются в 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() } }
Дополнительные сведения о сопрограммах см. в разделе Kotlin Coroutines для Android .