snapshotFlow的使用

7 阅读1分钟

一、一句话核心

snapshotFlow = 把 Compose 的 State 变化,转换成 Kotlin Flow

  • 监听 State/MutableState 的变化
  • 每次 State 更新 → 自动发射新值到 Flow
  • 可以用 Flow 操作符:map / filter / debounce / distinctUntilChanged
  • 常用于:State 防抖、State 转换、State 监听异步化

二、核心作用

Compose 状态变化 → 变成 Flow 流让你能用响应式编程处理状态:

  • 搜索框防抖
  • 状态过滤
  • 状态合并
  • 状态延迟
  • 状态转换

三、最简单示例

// 一个 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

fun <T> snapshotFlow(block: () -> T): Flow<T>

规则

  1. block 中必须读取 State
  2. State 变化 → Flow 自动发射
  3. 不读取 State → 不会发射
  4. 内部使用 Snapshot 系统(Compose 底层监听机制)

五、最经典使用场景

场景 1:搜索框 防抖(最常用)

kotlin

val searchState = remember { mutableStateOf("") }

LaunchedEffect(Unit) {
    snapshotFlow { searchState.value }
        .debounce(500)       // 防抖 500ms
        .filter { it.length > 2 } // 过滤长度>2
        .collect { query ->
            // 执行搜索
            viewModel.search(query)
        }
}

场景 2:监听状态变化

val countState = remember { mutableStateOf(0) }

LaunchedEffect(Unit) {
    snapshotFlow { countState.value }
        .collect {
        Log.d("Count", "计数:$it")
    }
}

场景 3:多个 State 合并监听

kotlin

val a = remember { mutableStateOf(1) }
val b = remember { mutableStateOf(2) }

LaunchedEffect(Unit) {
    snapshotFlow { a.value + b.value } // 任意一个变化都会触发
        .collect { sum ->
            Log.d("Sum", "总和:$sum")
        }
}

场景 4:状态转换


val ampState = remember { mutableStateOf(0f) }

LaunchedEffect(Unit) {
    snapshotFlow { ampState.value }
        .map { it.coerceIn(0f, 1f) } // 限制范围
        .collect {
        waveView.setAmplitude(it)
    }
}

六、核心特点(必记)

  1. 自动监听 State
  2. 只在值变化时发射
  3. 主线程安全
  4. 可使用所有 Flow 操作符
  5. Compose 原生支持,无需依赖
  6. 离开重组范围自动停止

七、snapshotFlow 生命周期

  • 在 LaunchedEffect 中使用

  • 当组件 退出组合 时

    • Flow 自动取消
    • 不会内存泄漏
  • 当 key 变化 时

    • 重新启动

八、和 rememberUpdatedState 区别

  • rememberUpdatedState:保证拿到最新值
  • snapshotFlow:把值变化变成,可防抖 / 过滤 / 延迟