Android Compose开发:是否需存储依赖其他变量的状态?
关于Dessert Clicker项目中状态存储的疑问与解答
我正在通过Android官方课程学习Android开发,在Dessert Clicker项目中,遇到一段代码存储了依赖于已保存状态变量的状态。原代码通过rememberSaveable存储currentDessertIndex的状态,同时也用rememberSaveable存储依赖它的currentDessertPrice和currentDessertImageId的状态。我认为无需存储这两个依赖变量的状态,直接通过currentDessertIndex从desserts列表中获取对应值即可,修改后的代码如下。请问我的做法是否正确,是否会引发问题?
原代码
@Composable private fun DessertClickerApp( desserts: List<Dessert> ) { var revenue by rememberSaveable { mutableStateOf(0) } var dessertsSold by rememberSaveable { mutableStateOf(0) } val currentDessertIndex by rememberSaveable { mutableStateOf(0) } var currentDessertPrice by rememberSaveable { mutableStateOf(desserts[currentDessertIndex].price) } var currentDessertImageId by rememberSaveable { mutableStateOf(desserts[currentDessertIndex].imageId) } ... }
修改后的代码
@Composable private fun DessertClickerApp( desserts: List<Dessert> ) { var revenue by rememberSaveable { mutableStateOf(0) } var dessertsSold by rememberSaveable { mutableStateOf(0) } val currentDessertIndex by rememberSaveable { mutableStateOf(0) } var currentDessertPrice = desserts[currentDessertIndex].price var currentDessertImageId = desserts[currentDessertIndex].imageId ... }
解答
你的做法完全正确,不会引发问题,反而更贴合Jetpack Compose的状态管理最佳实践:
currentDessertPrice和currentDessertImageId属于派生状态,它们的值完全由currentDessertIndex和desserts列表决定,不需要单独用rememberSaveable存储。原代码的写法反而存在状态同步风险——如果后续修改currentDessertIndex时忘记同步这两个变量,会导致UI显示的数据和实际状态不一致。- 直接通过
desserts[currentDessertIndex]获取对应值时,当currentDessertIndex发生变化,Compose会自动触发重组,计算出最新的价格和图片ID,确保UI始终和状态保持一致。 - 只要
Dessert是稳定类型(比如用data class定义,且所有属性都是稳定类型),desserts列表作为Composable参数传递时,Compose能正确追踪其变化,不会出现无效重组或数据错误。
小提示:如果desserts列表在每次重组时都会被重新创建(比如每次调用DessertClickerApp都生成新的List实例),可以给desserts加上remember修饰来避免不必要的重组,但如果desserts是从上层稳定传递下来的,这一步可以省略。
内容的提问来源于stack exchange,提问作者SONU
相关产品推荐
相关产品推荐

