在 Jetpack Glance 中将 CoroutineWorker 与 Android Widget 结合使用只会产生一个加载指示器

问题描述 投票:0回答:1

我已经使用 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 kotlin android-widget android-workmanager glance-appwidget
1个回答
0
投票

根据 Android Jetpack Glance 1.0.0 中接受的答案:更新小部件时出现问题

由于 Glance 在调用 .update 时进行了重构,因此无法更新。您将需要提供 GlanceStateDefinition 以返回更新的版本。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.