API24下如何在Jetpack Compose中保存WheelTimePicker选中时间?
解决API24下WheelTimePicker的LocalTime兼容与状态保存问题
核心问题拆解
- API24不支持
java.time.LocalTime,导致无法初始化和保存WheelTimePicker的选中时间 - 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
相关产品推荐
相关产品推荐

