Compose 中的 LaunchedEffect

发布于:2025-05-25 ⋅ 阅读:(22) ⋅ 点赞:(0)

LaunchedEffect 是 Jetpack Compose 中的一个副作用处理函数,它允许你在组合变化时运行挂起函数。特别适合那些需要与可组合项生命周期绑定的协程操作。

基本用法

@Composable
fun MyComposable() {
    var count by remember { mutableStateOf(0) }
    
    // 当key(count)变化时,LaunchedEffect会重新运行
    LaunchedEffect(count) {
        // 这个代码块在协程作用域中运行
        delay(1000) // 这里可以调用挂起函数
        println("计数在1秒后变为 $count")
    }
    
    Button(onClick = { count++ }) {
        Text("增加 ($count)")
    }
}

主要特性

  1. 协程作用域LaunchedEffect 中的代码在协程作用域中运行,当可组合项退出组合或key变化时自动取消

  2. 关键参数

    • 当可组合项进入组合时启动协程

    • 当任何key变化时重新启动

    • 当可组合项离开组合或key变化时取消

  3. 常见用途

    • 一次性操作(如显示Snackbar)

    • 启动需要清理的观察者

    • 动画

    • 任何挂起函数调用

示例

一次性效果(类似onCreate)

@Composable
fun OneTimeEffect() {
    LaunchedEffect(Unit) { // 使用Unit作为key表示只运行一次
        println("这只在组合时运行一次")
    }
}

动画示例

@Composable
fun AnimatedBox() {
    var animated by remember { mutableStateOf(false) }
    
    LaunchedEffect(animated) {
        animate(/* 动画参数 */)
    }
    
    Button(onClick = { animated = !animated }) {
        Text("切换动画")
    }
}

Snackbar示例

@Composable
fun SnackbarExample(scaffoldState: ScaffoldState) {
    var clickCount by remember { mutableStateOf(0) }
    
    LaunchedEffect(clickCount) {
        if (clickCount > 0) {
            scaffoldState.snackbarHostState.showSnackbar(
                "按钮被点击了 $clickCount 次"
            )
        }
    }
    
    Button(onClick = { clickCount++ }) {
        Text("点击我")
    }
}

重要提示

  • 如果不需要重新启动效果,可以使用 LaunchedEffect(Unit)

  • 确保key参数正确设置,避免不必要的重新启动

  • 协程会在效果离开组合时自动取消,无需手动清理


网站公告

今日签到

点亮在社区的每一天
去签到