配置Glance Widget后provideGlance方法未触发问题求助
Glance Widget配置后
provideGlance未触发的问题 我开发了一个Glance Widget,初始配置时会将若干ID保存至Shared Preferences,这些ID需要在provideGlance方法中读取。但即使调用了ValueWidget().update(context, glanceId)完成配置,provideGlance方法仍未被触发——日志显示该方法会在配置前被调用,但配置后完全没有响应。
Widget核心代码
class ValueWidget : GlanceAppWidget() { override suspend fun provideGlance(context: Context, id: GlanceId) { Timber.d("ValueWidget provideGlance: $id") val appWidgetId = GlanceAppWidgetManager(context).getAppWidgetId(glanceId = id) val elementIds = ValueWidgetUtils.loadElementIds(widgetId = appWidgetId, context) provideContent { Timber.d("ValueWidget provideContent: $id") } } }
配置Activity代码
@AndroidEntryPoint class ValueWidgetConfigureActivity : AppCompatActivity() { private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID public override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) // 设置默认返回结果为CANCELED,用户按返回键时会取消Widget添加 setResult(RESULT_CANCELED) setContent { val coroutineScope = rememberCoroutineScope() AppTheme( darkTheme = ThemeUtils.isDarkMode(this) ) { SelectItemsView( save = { elementIds -> // 将选中的ID保存到Shared Preferences ValueWidgetUtils.insertElementIds(appWidgetId, elementIds.toSet(), this) coroutineScope.launch { val context = this@ValueWidgetConfigureActivity val manager = GlanceAppWidgetManager(context) val glanceId = manager.getGlanceIdBy(appWidgetId) // 配置完成后更新Widget ValueWidget().update(context, glanceId) // 返回正确的Widget ID val resultValue = Intent() resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(RESULT_OK, resultValue) finish() } } ) } } // 从Intent中获取Widget ID appWidgetId = intent?.extras?.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID ) ?: AppWidgetManager.INVALID_APPWIDGET_ID // 如果没有获取到有效Widget ID,直接结束Activity if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish() return } } }
临时方案的局限性
我曾尝试在provideGlance中加入循环等待逻辑作为临时解决办法,但该方案仅在首次添加Widget时有效,编辑Widget配置时完全不起作用:
var elementIds = ValueWidgetUtils.loadElementIds(appWidgetId, context) while (elementIds.isEmpty()) { Timber.d("ValueWidget: No elements selected, waiting for selection") delay(1000) elementIds = ValueWidgetUtils.loadElementIds(appWidgetId, context) }
内容的提问来源于stack exchange,提问作者km11
相关产品推荐
相关产品推荐

