1 LaunchedEffect 副作用
作用 : 是 Compose 里用来在组合作用域启动协程的副作用 API。
本质:CoroutineScope 绑定到 Compose 生命周期,安全执行 suspend 函数(网络请求、数据库、延迟轮播、数据流收集)。
当进入这个 Composable 组合树时 → 自动启动协程;
当key 变化 / 组件离开组合(销毁) → 自动取消协程。
一个key和多个key都可以 也可以Unit无状态
场景 1:页面进来,一次性加载数据(key=Unit)
LaunchedEffect(Unit) {
// 页面首次渲染执行一次;页面销毁自动取消
viewModel.loadRemoteData()
}
场景 2:监听 key 变化,重新加载(比如轮播下标、id 变更)
LaunchedEffect(key1, key2, ...) {
// suspend 代码块,协程在这里执行
}
场景 3:收集 Flow / StateFlow
LaunchedEffect(Unit) {
viewModel.eventFlow.collect { event ->
// 处理ViewModel发出来的单次事件(弹窗、toast、导航)
}
}
2 rememberCoroutineScope()
作用: 获取一个和当前 Composable 生命周期绑定的协程作用域,不会自动执行代码,需要手动调用 .launch{} 才启动协程;当组件离开组合树时,scope 自动 cancel。
用户交互触发的协程(命令式动作)
1. 下拉刷新
2. 拖拽结束后执行动画滚动
3. 弹窗关闭后延时操作
4. 手势回调里面执行 suspend 函数
val scope = rememberCoroutineScope()
Button(onClick = {
scope.launch {
viewModel.submitData() // suspend接口
}
}) { Text("提交") }
3 LaunchedEffect 和rememberCoroutineScope() 的最大区别
- LaunchedEffect:声明式,key 驱动,自动跑协程
- rememberCoroutineScope:命令式,手动触发 launch(点击、下拉等事件里用)