一、一句话核心
snapshotFlow = 把 Compose 的 State 变化,转换成 Kotlin Flow
- 监听 State/MutableState 的变化
- 每次 State 更新 → 自动发射新值到 Flow
- 可以用 Flow 操作符:
map/filter/debounce/distinctUntilChanged - 常用于:State 防抖、State 转换、State 监听异步化
二、核心作用
把Compose 状态变化 → 变成 Flow 流 让你能用响应式编程处理状态:
- 搜索框防抖
- 状态过滤
- 状态合并
- 状态延迟
- 状态转换
三、最简单示例
scss
// 一个 Compose State
val textState = remember { mutableStateOf("") }
// 把 State 转成 Flow
val flow = snapshotFlow { textState.value }
// 像普通 Flow 一样使用
LaunchedEffect(Unit) {
flow.collect { text ->
// 每次 textState 变化,这里都会收到新值
Log.d("Flow", "新文本:$text")
}
}
四、完整语法
kotlin
kotlin
fun <T> snapshotFlow(block: () -> T): Flow<T>
规则
- block 中必须读取 State
- State 变化 → Flow 自动发射
- 不读取 State → 不会发射
- 内部使用 Snapshot 系统(Compose 底层监听机制)
五、最经典使用场景
场景 1:搜索框 防抖(最常用)
kotlin
scss
val searchState = remember { mutableStateOf("") }
LaunchedEffect(Unit) {
snapshotFlow { searchState.value }
.debounce(500) // 防抖 500ms
.filter { it.length > 2 } // 过滤长度>2
.collect { query ->
// 执行搜索
viewModel.search(query)
}
}
场景 2:监听状态变化
kotlin
val countState = remember { mutableStateOf(0) }
LaunchedEffect(Unit) {
snapshotFlow { countState.value }
.collect {
Log.d("Count", "计数:$it")
}
}
场景 3:多个 State 合并监听
kotlin
scss
val a = remember { mutableStateOf(1) }
val b = remember { mutableStateOf(2) }
LaunchedEffect(Unit) {
snapshotFlow { a.value + b.value } // 任意一个变化都会触发
.collect { sum ->
Log.d("Sum", "总和:$sum")
}
}
场景 4:状态转换
scss
val ampState = remember { mutableStateOf(0f) }
LaunchedEffect(Unit) {
snapshotFlow { ampState.value }
.map { it.coerceIn(0f, 1f) } // 限制范围
.collect {
waveView.setAmplitude(it)
}
}
六、核心特点(必记)
- 自动监听 State
- 只在值变化时发射
- 主线程安全
- 可使用所有 Flow 操作符
- Compose 原生支持,无需依赖
- 离开重组范围自动停止
七、snapshotFlow 生命周期
-
在 LaunchedEffect 中使用
-
当组件 退出组合 时
- Flow 自动取消
- 不会内存泄漏
-
当 key 变化 时
- 重新启动
八、和 rememberUpdatedState 区别
rememberUpdatedState:保证拿到最新值snapshotFlow:把值变化变成流 ,可防抖 / 过滤 / 延迟