[英]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.stateDefinition
、 PreferencesGlanceStateDefinition
、 LocalState
和GlanceAppWidget.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.