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

API24下如何在Jetpack Compose中保存WheelTimePicker选中时间?

解决API24下WheelTimePicker的LocalTime兼容与状态保存问题

核心问题拆解

  1. API24不支持java.time.LocalTime,导致无法初始化和保存WheelTimePicker的选中时间
  2. ViewPager切换页面后,原remember保存的状态丢失,无法恢复之前选中的时间

解决方案步骤

1. 启用Core Library Desugaring兼容LocalTime

这是Android官方提供的方案,无需额外第三方库,就能让API24及以上版本支持java.time系列类(包括LocalTime):
在app模块的build.gradle中添加以下配置:

android {
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}

2. 使用rememberSaveable持久化状态

替换原remember为rememberSaveable,它会将状态保存到SavedStateHandle,ViewPager切换页面返回时自动恢复:

  • 用mutableStateOf配合by委托实现状态的自动更新
  • 将startTime设置为保存的状态变量,而非每次调用LocalTime.now(),确保返回页面时显示之前选中的时间

修改后的完整代码示例

var time by rememberSaveable { 
    mutableStateOf(LocalTime.of(defaultHour, defaultMinute, defaultSecond)) 
}

WheelTimePicker(
    startTime = time,
    timeFormat = TimeFormat.AM_PM,
    size = DpSize(200.dp, 100.dp),
    rowCount = 3,
    textStyle = MaterialTheme.typography.titleSmall,
    textColor = colorResource(id = R.color.primaryLightTextColor),
    selectorProperties = WheelPickerDefaults.selectorProperties(
        enabled = true,
        shape = RoundedCornerShape(10.dp),
        color = Color(0xFFf1faee).copy(alpha = 0.2f),
        border = BorderStroke(1.dp, colorResource(id = R.color.time_picker_border))
    ),
    onSnappedTime = { snappedTime ->
        time = snappedTime
    }
)

备选方案(无需Desugaring)

如果不想启用Desugaring,可以自定义数据类存储时分秒,再通过Calendar转换:

// 自定义时间状态类
data class TimeState(val hour: Int, val minute: Int, val second: Int)

// 初始化时用Calendar获取默认时间
val calendar = Calendar.getInstance()
var timeState by rememberSaveable {
    mutableStateOf(TimeState(
        calendar.get(Calendar.HOUR),
        calendar.get(Calendar.MINUTE),
        calendar.get(Calendar.SECOND)
    ))
}

注:此方案需额外处理LocalTime与自定义状态的转换,更推荐使用官方Desugaring方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:53:14