You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:WidgetKit自定义Intent中父参数变更时重置子参数的方法

问题描述

我开发了一款可配置Widget,支持用户配置要显示的busStop和busService,其中busStop是busService的父参数:用户得先选busStop,才能选该站点对应的关联busService。

目前遇到的问题是:用户修改busStop(父参数)时,之前选的旧busService会留在配置里。举个例子:

  • Bus Stop 1 包含线路A、B、C
  • Bus Stop 2 包含线路D、E
    用户先选Bus Stop 1并设置显示线路A,之后切换到Bus Stop 2时,线路A还会显示,而且没法清除。
解决方法

1. 父参数变更时主动重置子参数

在Widget的配置页面里,监听busStop的选择事件,一旦检测到用户换了站点,立刻把busService的选中值清空,同时更新Widget的配置存储。

比如用Spinner做选择控件的话,代码可以这么写:

busStopSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        val selectedStop = parent?.getItemAtPosition(position) as BusStop
        // 重置线路选择控件到默认状态(比如第一个选项是"请选线路")
        busServiceSpinner.setSelection(0)
        // 更新配置,清除旧线路ID
        val prefs = context.getSharedPreferences("widget_config_$appWidgetId", Context.MODE_PRIVATE)
        prefs.edit()
            .putString("selected_bus_stop", selectedStop.id)
            .putString("selected_bus_service", null)
            .apply()
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {}
}

2. 优化线路列表的联动加载

每次切换busStop后,先清空原来的busService列表,再重新请求当前站点对应的线路数据,设置新的适配器后,默认不选中任何线路(或者选中提示选项),从根源避免旧值残留。

3. Widget更新时做参数合法性校验

在Widget的更新方法里,加一层校验:如果保存的busService不属于当前选中的busStop,就自动清除这个无效的线路参数,防止显示错误内容。

示例代码:

fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {
    val prefs = context.getSharedPreferences("widget_config_$appWidgetId", Context.MODE_PRIVATE)
    val stopId = prefs.getString("selected_bus_stop", null)
    val serviceId = prefs.getString("selected_bus_service", null)

    if (stopId != null && serviceId != null) {
        // 获取当前站点的有效线路列表
        val validServices = getValidBusServices(stopId)
        // 检查线路是否属于当前站点,不属于就清除
        if (!validServices.map { it.id }.contains(serviceId)) {
            prefs.edit().putString("selected_bus_service", null).apply()
        }
    }

    // 后续更新Widget UI的逻辑...
}

4. 结合配置Intent的规则优化

从你的Widget Intent设置来看,要确保busStop的变更能触发busService配置项的重置。可以在配置Intent的逻辑里,当busStop被修改时,直接移除之前保存的busService配置值;或者在打开线路选择界面时,先判断当前站点和线路是否匹配,不匹配就强制清空选中状态。

内容的提问来源于stack exchange,提问作者Koh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:37:22