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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:07:07