如何从配置/主 Activity 更新 Compose Glance Widget 的 AppWidgetState?

Kar*_*rim 2 android-widget android-jetpack-compose glance glance-appwidget

我最新的想法是使用

updateAppWidgetState(context = context, definition = PreferencesGlanceStateDefinition, glanceId = glanceId) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

GlanceWidget().update(context = context, glanceId = glanceId)
Run Code Online (Sandbox Code Playgroud)

但我无权访问glanceId。

问题的背景是我想将 uid 添加到 AppWidgetState,如本问题所述:How to get the AppWidgetId of a Compose Glance widget?

我怎样才能获得glanceId(例如,从我在配置活动中有权访问的appWidgetId)或者我该如何实现这一点?

Kar*_*rim 5

几个月后我终于解决了自己的问题。一个月前发布的1.0.0-alpha04版本中,出现了一种新getGlanceIdBy方法。

从现有 appWidgetId 获取 GlanceId 或从配置活动获取 Intent 的新方法(Icb70c、b/230391946)

我的代码现在看起来像这样:

// Try block because getGlanceIdBy throws IllegalArgumentException if no GlanceId is found for this appWidgetId.
try {
    val glanceAppWidgetManager = GlanceAppWidgetManager(context)
    val glanceId: GlanceId = glanceAppWidgetManager.getGlanceIdBy(appWidgetId)
    updateAppWidgetState(context = context, glanceId = glanceId) {
        it[intPreferencesKey("uid")] = uid
    }
    val glanceAppWidget: GlanceAppWidget = GlanceWidget()

    glanceAppWidget.update(context, glanceId)
} catch (e: IllegalArgumentException) {
    Log.d(TAG, "No GlanceId found for this appWidgetId.")
}
Run Code Online (Sandbox Code Playgroud)