我已经使用 Jetpack Glance 创建了一个 Android Widget,我需要使用 CoroutineWorker 更新它,所以我使用 WorkManager,这是示例代码
class MyWidget : GlanceAppWidget() {
companion object {
val KEY_TOPIC = stringPreferencesKey("topic")
val KEY_QUOTE = stringPreferencesKey("quote")
}
override val sizeMode = SizeMode.Exact
// override var stateDefinition: GlanceStateDefinition<*> = PreferencesGlanceStateDefinition
override suspend fun provideGlance(context: Context, id: GlanceId) {
provideContent {
val displayText = currentState(KEY_QUOTE) ?: "Quote not found"
val topic = currentState(KEY_TOPIC) ?: ""
GlanceTheme {
Scaffold(
titleBar = {
TitleBar(startIcon = ImageProvider(R.mipmap.ic_launcher), title = "Hello")
}, backgroundColor = GlanceTheme.colors.widgetBackground
) {
Column(
modifier = GlanceModifier.background(color = Color.Red)
.padding(30.dp)
) {
Text(
text = "Display Text is $displayText && Topic is $topic",
style = TextStyle(
color = ColorProvider(
color = Color(0xFF000000)
),
fontSize = 12.sp,
fontWeight = FontWeight.Medium
),
modifier = GlanceModifier.clickable {
actionStartActivity(activity = MainActivity::class.java)
}
)
Button(
"Start Activity", onClick = actionStartActivity<MainActivity>(),
style = TextStyle(
color = ColorProvider(
color = Color(0x00FF0000)
),
fontSize = 12.sp,
fontWeight = FontWeight.Medium
),
)
}
}
}
}
}
override fun onCompositionError(
context: Context,
glanceId: GlanceId,
appWidgetId: Int,
throwable: Throwable
) {
super.onCompositionError(context, glanceId, appWidgetId, throwable)
val remoteView = RemoteViews(context.packageName, R.layout.custom_error_layout)
Log.i("errorMessageis", "${throwable.message} ${throwable.localizedMessage}")
remoteView.setTextViewText(
R.id.textview,
"${throwable.message} ${throwable.localizedMessage}"
)
AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteView)
}
}
@HiltWorker
class CustomWorker @AssistedInject constructor(
@Assisted val context: Context,
@Assisted workerParameters: WorkerParameters,
) : CoroutineWorker(context, workerParameters) {
override suspend fun doWork(): Result {
CoroutineScope(Dispatchers.IO).launch {
val currentTimeMillis = System.currentTimeMillis()
val date = Date(currentTimeMillis)
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
val formattedDate = sdf.format(date)
val glanceIds =
GlanceAppWidgetManager(context).getGlanceIds(MyWidget::class.java)
glanceIds.forEach { id ->
updateAppWidgetState(context, id) { prefs ->
prefs[KEY_QUOTE] = currentTimeMillis.toString()
prefs[KEY_TOPIC] = formattedDate
}
MyWidget().update(context, id)
}
}
return Result.success()
}
}
现在,当我尝试从安装的 Android 应用程序创建小部件时,它只显示从
android:initialLayout="@layout/glance_default_loading_layout"
创建的加载屏幕
这里是完整的源代码 我没有看到任何这样的错误消息
根据 Android Jetpack Glance 1.0.0 中接受的答案:更新小部件时出现问题
由于 Glance 在调用 .update 时进行了重构,因此无法更新。您将需要提供 GlanceStateDefinition 以返回更新的版本。