Compose 附带效应
a. 纯函数
纯函数指的是函数与外界交换数据只能通过函数参数和函数返回值来进行,纯函数的运行不会对外界环境产生任何的影响。比如下面这个函数:
fun Add(a : Int, b : Int) : Int {
return a + b
}
“副作用”(side effect),指的是如果一个操作、函数或表达式在其内部与外界进行了互动,产生运算以外的其他结果,则该操作或表达式具有副作用。
最典型的情况,就是修改了外部环境的变量值。例如如下代码:Add() 函数执行它需要一个外部变量 a,先进行 ++ 操作,然 a + b 返回。只要这个函数一执行,外部变量 a 就会改变。而对于这个 a 所产生的改变,这个就叫做副作用。
var a
fun Add(b : Int) : Unit{
a++
return a + b
}
因此,组合函数也是一个函数,那么它也分为有副作用的和没副作用的。而组合函数的副作用和其它函数还有一些差异。
组合函数的特点
a. 执行顺序不定;b. 可以并行运行;c. 可能会非常频繁地运行
处理副作用
虽然我们不希望函数执行中出现副作用,但现实情况是有一些逻辑只能作为副作用来处理。例如一些 IO 操作、计时、日志埋点等,这些都是会对外界或收到外界影响的逻辑,不能无限制的反复执行。所以 Compose 需要能够合理地处理一些副作用。
副作用的执行时机是明确的,例如在 Recomposition 时等。
副作用的执行次数是可控的,不应该随着函数反复执行。
副作用不会造成泄漏,例如对于注册要提供适当的时机取消注册。
组合函数的副作用
组合函数是主要是用来做 UI 声明的、描述的,只要你在可组合函数内做了与 UI 描述不相关的操作,这一类操作其实都属于副作用。
在 Compose 中可组合函数内部理应只做视图相关的事情,而不应该做函数返回之外的事情,如访问文件等,如果有,那这就叫做附带效应,以下操作全部都是危险的附带效应:
写入共享对象的属性;
更新 ViewModel 中的可观察项。
更新共享偏好设置。
可组合函数应该是无副作用的,但是如果我们要在 Compose 里面使用可组合函数而且会产生附带效应,这时就需要使用 EffectAPI,以便以可预测的方式执行那些副作用。一个 effect,就是一个可组合函数,这个可组合函数不生成 UI,而是在组合完成时产生副作用。
组合函数的生命周期
这些 Effect API 是与我们组合函数的生命周期相关联的。可组合项的生命周期比 activity 和 fragment 的生命周期更简单,一般是进入组合、执行0次或者多次重组、退出组合。
Enter:挂载到树上,首次显示。
Composition:重组刷新 UI。
Leave:从树上移除,不再显示。
组合函数中没有自带的生命周期函数,想要监听其生命周期,需要使用 Effect(附带效应)API :
LaunchedEffect:第一次调用 Compose 函数的时候调用。
&nb