https://www.youtube.com/watch?v=0G_1XCRlpYM
还是pl的学习视频
首先是冷流转换成热流 stateflow
var countTimer = flow {
delay(1000)
countTime++
emit(countTime)
}
.stateIn(
viewModelScope,
SharingStarted.Lazily, //订阅之后开始发送,然后never stop
0
)
SharingStarted.Lazily 和SharingStarted.Eagerly的区别是,一个是订阅之后才开始发送,一个是立即开始发送,但是两个都不会停止
另外一个SharingStarted.WhileSubscribed 有两个参数,一个是 停止 的时间,另外一个是值缓存的时间,默认是永久
将冷流转换成热流stateflow的场景,基本上是我们需要费好大力气才获取的值,然后也可能有多个订阅者,我们想把值缓存起来,不用多次去请求,发送,这时候,就进行stateIn转换。
那我们收集的时候该怎么收集呢?
val collectAsState = viewModel.countTimer.collectAsState() val collectAsStateWithLifecycle = viewModel.countTimer.collectAsStateWithLifecycle()
两者的区别,是否感知生命周期,如果希望在界面不可见的时候停止订阅,比如跳转,比如进入后台则使用collectAsStateWithLifecycle,collectAsState则不会停止。
当然collectAsStateWithLifecycle需要引入
androidx-lifecycle-runtime-compose