Jetpack Compose中为何要使用derivedStateOf?两段代码运行结果一致存疑
我发现Code A和Code B的运行结果完全一致,想请教在Jetpack Compose中为何要在Code A里使用derivedStateOf?
Code A
var age by remember { mutableStateOf(1) } val person by remember { derivedStateOf { "my age is $age" } } Column { Button(onClick = { age += 1 }) { Text(text = "click add age") } Text(text = person) }
Code B
var age by remember { mutableStateOf(1) } val person= "my age is $age" Column { Button(onClick = { age += 1 }) { Text(text = "click add age") } Text(text = person) }
你的例子因为逻辑太简单,所以两段代码运行起来没区别,但derivedStateOf的价值在复杂场景下才会凸显,核心作用有三个:
性能优化:避免重复计算与不必要重组
如果person的计算逻辑不是简单字符串拼接,而是涉及遍历列表、复杂运算或者依赖多个State,直接像Code B那样写的话,每次Composable重组时都会重新执行计算逻辑。而derivedStateOf会缓存计算结果,只有当它依赖的State(比如这里的age)发生变化时,才会重新计算。另外,如果多个子Composable都用到person,用derivedStateOf能确保整个组合树里只计算一次,减少冗余开销。逻辑封装:集中管理状态转换
当你需要从原始State派生出新状态时,把转换逻辑放在derivedStateOf里可以让代码更清晰。比如如果后续要给person加更多逻辑(比如根据年龄判断是否成年、拼接名字等),直接修改derivedStateOf的闭包即可,不用在多个地方重复写转换逻辑,维护起来更方便。精准控制重组范围
如果person被传递给多个子Composable,用derivedStateOf的话,只有当person的实际值变化时,子Composable才会重组。而Code B的写法中,只要父Composable因为其他State变化触发重组,即使person的值没变,子Composable也会跟着重组,造成不必要的性能损耗。
简单来说,derivedStateOf是Jetpack Compose中处理派生状态的标准方式,适合用来封装从原始State到目标状态的转换逻辑,同时优化重组性能。
内容的提问来源于stack exchange,提问作者HelloCW

