如何在derivedStateOf变更时触发回调?现有实现过于繁琐
如何简洁处理derivedStateOf的变更回调?
我想在derivedStateOf计算的状态发生变更时触发回调,目前的实现代码如下:
var previouslySelectedIndex by rememberSaveable { mutableStateOf<Int?>(null) } val nowSelectedIndex by remember { derivedStateOf { // 这里是计算逻辑 } } nowSelectedIndex?.let { nowSelected -> if(previouslySelectedIndex == null || previouslySelectedIndex != nowSelected) { previouslySelectedIndex = nowSelected onSelectedItemChanged(nowSelected) } }
我觉得这种写法太繁琐,考虑到derivedStateOf只会在状态变更时触发,有没有类似下面这种简洁的写法?
nowSelectedIndex.onChange { onSelectedItemChanged(nowSelected) }
简洁实现方案
你可以通过扩展函数结合LaunchedEffect来实现这种简洁的语法,无需手动维护对比用的状态变量:
1. 定义通用扩展函数
fun <T> State<T>.onChange(action: (T) -> Unit) { val currentValue = value LaunchedEffect(currentValue) { action(currentValue) } }
2. 实际使用
val nowSelectedIndex by remember { derivedStateOf { // 这里是计算逻辑 } } nowSelectedIndex.onChange { nowSelected -> nowSelected?.let { onSelectedItemChanged(it) } }
原理说明
LaunchedEffect会以currentValue为依赖,只有当这个值发生变化时,才会执行内部的回调逻辑,天然满足“仅状态变更时触发”的需求。- 不需要手动维护
previouslySelectedIndex,LaunchedEffect会自动处理相同值的重复触发问题,只有值真正变化时才会执行回调。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

