Jetpack Compose中如何为Color实现Saver以结合rememberSaveable使用?
解决Color在rememberSaveable中保留状态的问题
报错原因是Color不属于Bundle默认支持的可存储类型,rememberSaveable需要借助自定义Saver来实现Color与Bundle兼容类型的转换,以下是两种可行的实现方式:
方式一:利用Color的ARGB Long值实现
Color类本身提供了value属性,对应其ARGB格式的Long值,Bundle支持存储Long类型,基于此实现Saver:
// 定义Color的自定义Saver val ColorSaver = Saver<Color, Long>( save = { it.value }, // 将Color转为对应的ARGB Long值 restore = { Color(it) } // 通过Long值重建Color对象 ) // 使用rememberSaveable时传入该Saver var color by rememberSaveable(stateSaver = ColorSaver) { mutableStateOf(Color.Red) }
方式二:拆分RGBA浮点值实现
将Color的红、绿、蓝、透明度四个浮点值拆分为数组存储,Bundle支持存储Float数组:
// 定义Color的自定义Saver val ColorSaver = Saver<Color, FloatArray>( save = { floatArrayOf(it.red, it.green, it.blue, it.alpha) }, restore = { Color(it[0], it[1], it[2], it[3]) } ) // 使用方式同上 var color by rememberSaveable(stateSaver = ColorSaver) { mutableStateOf(Color.Red) }
两种方式均能解决屏幕旋转后Color状态丢失的问题,第一种更简洁高效,第二种适合理解状态保存的转换逻辑。
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

