Compose 中的 LaunchedEffect
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)")}
}
主要特性
-
协程作用域:
LaunchedEffect
中的代码在协程作用域中运行,当可组合项退出组合或key变化时自动取消 -
关键参数:
-
当可组合项进入组合时启动协程
-
当任何key变化时重新启动
-
当可组合项离开组合或key变化时取消
-
-
常见用途:
-
一次性操作(如显示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参数正确设置,避免不必要的重新启动
-
协程会在效果离开组合时自动取消,无需手动清理