前言
我常用的监听值变化有两种方式
- 使用 LaunchedEffect
监听变化
在 Jetpack Compose 里,有多种方式可以监听 MutableState
的变化。
下面为你详细介绍不同的实现方法:
ViewModel中监听(推荐)
如果需要在非 Composable 代码(如 ViewModel)中监听 MutableState
变化,
同样可以通过 snapshotFlow
转换为 Flow,再在 ViewModel 中收集。
监听单个值
示例:在 ViewModel 中监听
1 | import androidx.compose.runtime.mutableStateOf |
使用场景:
当需要在业务层(ViewModel)响应 UI 层的状态变化时(如输入校验、实时搜索等),这种方式非常合适。
监听多个值
1 | init { |
使用LaunchedEffect
LaunchedEffect
是一个副作用函数,它可以在组合发生时启动一个协程。你可以将 MutableState
作为 LaunchedEffect
的键,当 MutableState
的值改变时,LaunchedEffect
会自动取消并重新启动。
示例代码
1 | import androidx.compose.runtime.* |
代码解释
LaunchedEffect(count)
:把count
当作键传递给LaunchedEffect
,只要count
的值改变,LaunchedEffect
内部的代码就会重新执行。println("count 的值已更新为: $count")
:当count
变化时,打印出更新后的值。
对比
比如我们想在subjectId该百年的时候加载数据,使用下面两种方式
vm中使用snapshotFlow把值转为流监听变化
1 | init { |
Compose中使用LaunchedEffect监听变化
1 | LaunchedEffect(vm.subjectId.value) { |
个人推荐snapshotFlow
的方式。
原因是
LaunchedEffect 是在值变化的时候会触发,但是同时在组件重组的时候也会触发,这就导致值没变也可能会触发多次事件。
所以更推荐使用
snapshotFlow
。