snapshotFlow的使用

一、一句话核心

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>

规则

  1. block 中必须读取 State
  2. State 变化 → Flow 自动发射
  3. 不读取 State → 不会发射
  4. 内部使用 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)
    }
}

六、核心特点(必记)

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

七、snapshotFlow 生命周期

  • LaunchedEffect 中使用

  • 当组件 退出组合

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

    • 重新启动

八、和 rememberUpdatedState 区别

  • rememberUpdatedState:保证拿到最新值
  • snapshotFlow:把值变化变成 ,可防抖 / 过滤 / 延迟
相关推荐
菜鸟国国3 小时前
从0开始学Jetpack Compose|第二篇:基础组件+核心布局,从零搭建实用UI
android jetpack
simplepeng4 小时前
mutableStateOf(list) vs mutableStateListOf():该如何选择?
android jetpack
zh_xuan20 小时前
Android Jetpack DataStore存储数据
android·android jetpack·datastore
simplepeng1 天前
MVI with Jetpack Compose:让你的应用更简洁和整洁
android jetpack
simplepeng1 天前
别再让团队困惑:少有人提及的 MVI 命名规范
android jetpack
zh_xuan1 天前
Android Jetpack 使用Room数据库
android·android jetpack·room
alexhilton4 天前
Jetpack Compose中的富文本输入
android·kotlin·android jetpack
海盐芝士不加糖4 天前
我又又又辞职了,然后做了一款“离线版微信”
kotlin·app·android jetpack
XiaoLeisj5 天前
Android 媒体能力实战:从 Media3 音视频播放到 CameraX 拍照与视频录制
android·音视频·媒体·android jetpack