下面几部分介绍了如何更新 GlanceAppWidget
并管理其
状态。
管理GlanceAppWidget
状态
每当 widget 被实例化时,提供的 GlanceAppWidget
类都会进行实例化。
因此应是无状态且被动的。
状态的概念可以分为以下几个部分:
- 应用状态:应用所要求的应用状态或内容 微件。例如,由 用户。
- Glance 状态:仅与应用 widget 相关的特定状态 不一定会修改或影响应用的状态。例如, 复选框,或计数器增加。
使用应用状态
应用 widget 应处于被动状态。每个应用都负责管理 并处理状态,例如空闲、正在加载和错误反映 。
例如,以下代码会从内存中的 提供存储的目的地列表,以及 根据其状态显示不同的界面:
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 } } } }
每当状态或数据发生变化时,应用就负责通知 并更新该 widget。如需了解详情,请参阅更新 GlanceAppWidget。
更新 GlanceAppWidget
如管理 GlanceAppWidget
状态部分所述,应用
在不同进程中托管“资讯一览”会将内容翻译成
实际的 RemoteViews
并将其发送到主机。如需更新内容,请
必须重新创建 RemoteViews
并重新发送。
如需发送更新,请调用 GlanceAppWidget
实例的 update
方法,
提供 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() } }
如需详细了解协程,请参阅 Android 上的 Kotlin 协程。