关于compose的remember

之前有一段代码这样的

Kotlin 复制代码
@Composable
fun WeekDays(checkInList: List<WidgetCheckInBean>?) {
    val today = LocalDate.now()
    val daysOfWeek = remember {
        // 获取最近7天的星期信息
        getLastSevenWeekdays(today)
    }
    
    ......
}

根据当前时间,获取过去七天的时间列表,

然后出现了一个bug,更改手机时间,虽然,,大部分人不会这么做,但是更新时间之后呢呢,会触发 checkInList更新,获取最新数据,但是这时候,由于 daysOfWeek 并没有任何触发更新机制,导致daysOfWeek 还是remember中的原来的值,导致时间还是原来的时间列表。

所以这个我们需要加上daysOfWeek 和 checkInList的联动更新

就用到了

Kotlin 复制代码
val daysOfWeek = remember(checkInList) {
        val today = LocalDate.now()
        // 获取最近7天的星期信息
        getLastSevenWeekdays(today)
    }

让checkInList变成daysOfWeek 触发更新的key。

etpack Compose 的一个特点是,当状态(State)发生变化时,相关的 Composable 函数会重组(Recomposition),也就是函数会重新执行。•如果没有 remember:每次重组都会导致函数内的所有代码重新执行。这意味着在函数内创建的任何局部变量都会被重新初始化为其默认值。这会导致状态丢失,例如,一个计算结果、一个随机数、一个列表,都会在每次UI更新时被重置。•有了 remember:remember { ... } 块内的计算逻辑只会在 首次组合(Initial Composition)时执行一次。在后续的重组过程中,Compose 会跳过这个块的执行,直接返回它"记住"的那个计算结果。

通过key,让他更智能的更新,不必要的时候不更新,只是key变化了,才触发更新

相关推荐
恋猫de小郭1 小时前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter
Starry-sky(jing)19 小时前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda
雨白19 小时前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
疯华整猫20 小时前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
灿飞21 小时前
Kotlin与Java虚拟机十一:类与属性:构造顺序、backing field 与显式 backing field
java·后端·kotlin
传奇开心果21 小时前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin
Frankie_stand1 天前
测试自动化实战指南:从脚本化、自动判据到 CI 集成的完整落地路径
android·ci/cd·自动化
恋猫de小郭1 天前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
Kapaseker1 天前
领导问我 Kotlin 的 Nothing 是什么?
android·kotlin