remeber 函数

  • 它是一个泛型函数, 你可以通过它记住任何类型的数据(比如一个对象、一个列表、一个状态等).
  • 它接收一个 Lambda 表达式:也就是我们在大括号 { } 里写的初始化代码.
  • 它返回一个值:返回的就是你大括号里计算出来的那个对象.

它和普通函数有什么区别?

普通的函数每次被调用时,都会从头到尾执行一遍里面的代码。但 remember 是一个带有记忆功能的函数: 首次执行时:它会运行大括号 {} 里的代码,把结果存起来,然后返回这个结果。 后续重组(Recomposition)时:当界面因为状态改变而重新绘制时,Compose 会跳过大括号里的代码,直接把之前存好的那个结果返回给你。

LaunchedEffect 函数

  • LaunchedEffect 是一个核心的副作用(Side Effects)处理 API,主要用于在 Composable(可组合项)的生命周期内安全地启动协程并执行异步任务
  • LaunchedEffect 接收一个或多个 key 参数以及一个挂起函数代码块(block)。它的运行机制如下:
  1. 首次启动:当 Composable 首次进入组件树时,会启动协程并执行代码块。
  2. 重启机制:当任何一个 key 的值发生变化时,LaunchedEffect 会先取消正在运行的旧协程,然后立即启动一个新协程重新执行代码块。如果 key 未变,协程将继续运行,不会重启。
  3. 自动取消:当包含 LaunchedEffect 的 Composable 从组件树中被移除时,它会自动取消协程,完美解决生命周期管理和内存泄漏问题。

为什么需要 LaunchedEffect?

  • 在 Compose 的声明式范式中,Composable 函数会因为状态变化而被频繁重组(Recomposition)。如果直接在函数体内部调用挂起函数或启动不受管理的协程,会导致以下问题:
  1. 重复执行:每次重组都会重新触发异步任务,造成资源浪费。
  2. 副作用污染:Composable 函数应保持纯净,仅负责描述 UI,不应包含网络请求等副作用。
  3. 生命周期与内存泄漏:当组件离开屏幕时,未受管理的协程可能继续运行,导致内存泄漏或在不恰当的时机更新 UI。