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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:58:13