簡體   English   中英

如何獲取 Compose Glance 小部件的 AppWidgetId?

[英]How to get the AppWidgetId of a Compose Glance widget?

我有一個包含用戶創建的所有小部件的表格。 我想使用相應的表條目自定義各個小部件,並在與小部件交互時更新相應的表條目。

uid AppWidgetId 標題
0 23 第一個小部件
1 165 第二個小部件

(1) 當用戶點擊小部件時,我只想更新被點擊的小部件的條目。 在非 Glance 世界中,我通過向每個小部件添加一個 onClickListener 來做到這一點,看起來有點像這樣:

val widgetView = RemoteViews(context.packageName, R.layout.widget_layout)
val widgetPendingIntent = ...
widgetView.setOnClickPendingIntent(R.id.appwidget_text, widgetPendingIntent)
val appWidgetManager = AppWidgetManager.getInstance(context)
appWidgetManager.updateAppWidget(appWidgetId, widgetView)

在 Glance 小部件中,我假設我需要像這樣使可組合可點擊:

    @Composable
    override fun Content() {
        Column(
            modifier = GlanceModifier
                .fillMaxSize()
                .clickable(onClick = actionRunCallback<ClickOnWidget>())
        ) {
            Text(
                text = "Title",
                modifier = GlanceModifier.fillMaxSize(),
            )
        }
    }

ActionCallback 看起來像這樣:

class ClickOnWidget : ActionCallback {
    override suspend fun onRun(context: Context, glanceId: GlanceId, parameters: ActionParameters) {
       // Update my table with the click
    }
}

我希望這里有一個 appWidgetId,但只看到一個glanceId:GlanceId。 我可以使用它來獲取 appWidgetId 或直接使用 GlanceId 作為我表中的標識符嗎?

(2) 我想根據表格中的數據來設置我的小部件的樣式。 根據具有相應 appWidgetId 的表條目設置小部件樣式的最佳方法是什么? 例如以某種方式是這樣的:

    @Composable
    override fun Content() {
        Column(
            modifier = GlanceModifier
                .fillMaxSize()
                .clickable(onClick = actionRunCallback<ToastAction>())
        ) {
            Text(
                // *** Add a text depending on the appWidgetId ***
                text = titleOf(appWidgetId),
                modifier = GlanceModifier.fillMaxSize(),
            )
        }
    }

您無法獲取 AppWidgetId,這是設計使然。

對於您的用例,我們建議您在每次創建新的 App Widget 時創建自己的穩定 ID。 您將將該 ID 存儲在附加到 App Widget 的 state 中,並使用它將其鏈接到您的一些數據(您之前存儲 AppWidgetId 的位置)。 這種間接的原因是我們打算處理備份和恢復,但 AppWidget ID 在此過程中會發生變化,因此在您自己的數據結構中依賴它們並不是一個很好的方法。

要實現這一點,您可能需要查看GlanceAppWidget.stateDefinitionPreferencesGlanceStateDefinitionLocalStateGlanceAppWidget.updateAppWidgetState

GlanceAppWidget@Composable Content() function 中,您可以使用LocalGlanceId.current

您可以通過將其放入mutableStateOf()中找到它時執行某些操作,然后等待該 snapshop 更改。

class TestWidget(): GlanceAppWidget() {

  var glanceId: GlanceId? by mutableStateOf(null)
  ...

  @Composable
  override fun Content() {
    glanceId = LocalGlanceId.current
    ...
  }

  fun someFunction() {
    val glanceId = snapshotFlow { glanceId }.filterNotNull().first()
    // now use the glanceId
  }
}

好吧,我也為此苦苦掙扎,最后我記錄了glanceId,它打印如下:AppWidgetId(appWidgetId=304)

這是我的黑客方式:

val appWidgetId = LocalGlanceId.current.toString().filter { it.isDigit() }.toInt()

如果您不升級您的glance 版本或者Google 使用appWidgetId 保留打印glance id 應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM