本文代码

对比 collectAsStatecollectAsStateWithLifecycle

collectAsState collectAsStateWithLifecycle
不同点 没有生命周期感知,在App退到后台依然保持对流的 订阅 状态 在App退到后台退出对流的 订阅 状态
应用场景 在Android开发上不建议使用,以后Compose面向多平台可能会使用。 替代 collectAdState 用于转换 Flow 和 State

测试一下,令 StateFlow最后一个订阅者 消失之后 stop the sharing coroutine

1
2
3
4
5
6
7
val numberFlow: StateFlow<Int> = mutableNumberFlow.onEach {
LogUtil.d("ViewModel的StateFlow: $it")// 1
}.stateIn(
scope = viewModelScope.plus(Dispatchers.Default),
started = SharingStarted.WhileSubscribed(5_000),// 5s 后停止协程
initialValue = 0
)

测试结果

  • collectAsState 持续打印 注释1
  • collectAsStateWithLifecycle 在退到后台5s后停止打印 注释1

结论,为了节省电量对用户友好,建议使用collectAsStateWithLifecycle

之前使用collectAsState 也没什么啦,反正Compose在后台也不会组合啊。就省点内存也没省多少,不过有就用吧。

参考资料 Manuel Vivo