如何结束/关闭 MutableSharedFlow?

Jof*_*rey 12 kotlin kotlin-coroutines kotlin-coroutines-flow

SharedFlow刚刚在协程 1.4.0-M1 中引入,它旨在替换所有BroadcastChannel实现(如设计问题描述中所述)。

我有一个用例,我使用 aBroadcastChannel来表示传入的 Web 套接字帧,以便多个侦听器可以“订阅”这些帧。当我移动到 a 时,我遇到的问题SharedFlow是当我收到关闭帧或上游错误时我无法“结束”流程(我想这样做是为了通知所有订阅者流程已经结束)。

当我想有效地“关闭” 时,如何使所有订阅终止SharedFlow?有没有办法区分正常关闭和异常关闭?(如频道)

如果MutableSharedFlow不允许将流的结尾传达给订阅者,如果BroadcastChannel被弃用/删除,有什么替代方法?

Kis*_*kae 6

SharedFlow文档描述了您需要的内容:

请注意,大多数像 Flow.toList 这样的终端操作符在应用于共享流时也不会完成,但是像 Flow.take 和 Flow.takeWhile 这样的流截断操作符可以用于共享流以将其转换为完成流。

SharedFlow 不能像 BroadcastChannel 一样关闭,也不能代表失败。如果需要,所有错误和完成信号都应明确具体化。

基本上,您需要引入一个可以从共享流发出的特殊对象,以指示流已结束,takeWhile在消费者端使用可以使它们发出直到收到该特殊对象。