<
Compose学习笔记 各个 effect 的 执行时机 执行次数 和 用途
>
上一篇

Compose学习笔记 点击 手势 触控 滑动 拖拽 pointerinput detectxxxgestures
下一篇

Android studio 项目中 agp kgp gradle as jdk 版本对应关系

在 Jetpack Compose 中,各个 Effect 的 执行时机 执行次数 和 用途:

1. LaunchedEffect

2. SideEffect

3. DisposableEffect

4. rememberUpdatedState

如果不使用 rememberUpdatedState,在重组过程中有可能会捕获了旧的值,而 rememberUpdatedState 可以保持最新的值

虽然它与 Effect API 有一定关联,但它的主要功能是处理状态更新的闭包问题,主要用于回调中,确保回调中的状态始终是最新的

rememberUpdatedState 场景示例

// 正确使用
@Composable
fun ExampleComponent() {
    // 计数状态,初始值为 0
    var count by remember { mutableStateOf(0) }
    
    // 使用 rememberUpdatedState 保持最新的 count 值
    val updatedCount = rememberUpdatedState(count)

    // 一个按钮,点击时增加计数
    Button(onClick = { count++ }) {
        Text("Increment Count: $count")
    }

    // 启动一个协程,模拟异步操作
    LaunchedEffect(Unit) {
        // 模拟延迟
        delay(2000)
        // 使用 updatedCount.value 访问最新的计数
        println("Latest Count after delay: ${updatedCount.value}")
    }
}

// (实测并非百分比出现)
// 错误使用
// 如果在 LaunchedEffect 启动时 count 的值是 0,即使你在延迟期间点击了按钮并增加了 count,在打印时仍然会输出 0。这是因为 LaunchedEffect 在首次组合时捕获了 count 的值
@Composable
fun ExampleComponent() {
    var count by remember { mutableStateOf(0) }

    // 按钮,点击时增加计数
    Button(onClick = { count++ }) {
        Text("Increment Count: $count")
    }

    // 启动一个协程,直接使用 count
    LaunchedEffect(Unit) {
        // 模拟延迟
        delay(2000)
        // 使用 count 访问当前计数
        println("Count after delay: $count")
    }
}

5. produceState

produceState 主要适用于需要直接在 Composable 中处理异步操作的情况

Top
Foot