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参数正确设置,避免不必要的重新启动
协程会在效果离开组合时自动取消,无需手动清理