使用SharingStarted.Lazily时onSubscription内上游发射值未被收集问题咨询
返回一个流,该流会在当前共享流开始被收集(即订阅注册完成后)调用指定动作。该动作会在上游流向此订阅发射任何值之前、订阅建立之后执行。可以保证,在
onSubscription动作内部或紧随其后向上游流的所有发射都会被此订阅收集。动作的接收者是FlowCollector,因此onSubscription可以发射额外元素。
但当共享流以started = SharingStarted.Lazily创建时,在onSubscription内部向上游流发射的值不会被该订阅收集,具体示例如下:
SharingStarted.Lazily 示例
suspend fun main() { coroutineScope { val upstream = MutableSharedFlow<Int>() upstream.shareIn( scope = this, started = SharingStarted.Lazily, ).onSubscription { println("subscription") upstream.emit(42) }.collect { println("value $it") } } }
输出:
subscription
SharingStarted.Eagerly 示例
suspend fun main() { coroutineScope { val upstream = MutableSharedFlow<Int>() upstream.shareIn( scope = this, started = SharingStarted.Eagerly, ).onSubscription { println("subscription") upstream.emit(42) }.collect { println("value $it") } } }
输出:
subscription value 42
我清楚可以直接使用emit(42)替代upstream.emit(42),但需求是必须向上游流发射值。我尝试理解为何使用SharingStarted.Lazily时onSubscription的表现不符合文档描述,但始终没能完全理清,希望有人能详细解释此现象的原因,最好结合Flow实现代码中的具体逻辑说明为何此时无法保证发射值被收集。
内容的提问来源于stack exchange,提问作者Simon Forsberg
相关产品推荐
相关产品推荐

