nextEvent

inline suspend fun <E : Event> EventChannel<*>.nextEvent(priority: EventPriority = EventPriority.NORMAL, noinline filter: suspend (E) -> Boolean = { true }): E

挂起当前协程, 直到监听到事件 E 的广播并通过 filter, 返回这个事件实例.

本函数是 EventChannel.subscribe 的衍生工具函数, 内部会调用 EventChannel.subscribe.

挂起可取消

本函数的挂起过程可以被取消. 这意味着若在 CoroutineScope.launch 中使用本函数, 则 launch 启动的 Job 可以通过 Job.cancel 取消 (停止), 届时本函数会抛出 CancellationException.

异常处理

filter 抛出的异常属于监听方异常, 将会由 nextEvent 原样重新抛出.

使用 Flow 的替代方法

在 Kotlin 可使用 EventChannel.asFlow 配合 Flow.filterFlow.first 实现与 nextEvent 相似的功能 (注意, Flow 方法将会使用 EventPriority.MONITOR 优先级).

示例:

val event: GroupMessageEvent = GlobalEventChannel.asFlow().filterIsInstance<GroupMessageEvent>().filter { it.sender.id == 123456 }.first()
// 上下两行代码等价
val event: GroupMessageEvent = GlobalEventChannel.filterIsInstance<GroupMessageEvent>().nextEvent(EventPriority.MONITOR) { it.sender.id == 123456 }

由于 Flow 拥有更多操作 (如 Flow.firstOrNull), 在不需要指定事件优先级时使用 Flow 拥有更高自由度.

Since

2.10

Parameters

filter

过滤器. 返回 true 时表示得到了需要的实例. 返回 false 时表示继续监听


inline suspend fun <E : Event> EventChannel<*>.nextEvent(    priority: EventPriority = EventPriority.NORMAL,     intercept: Boolean = false,     noinline filter: suspend (E) -> Boolean = { true }): E

挂起当前协程, 直到监听到事件 E 的广播并通过 filter, 返回这个事件实例.

本函数是 EventChannel.subscribe 的衍生工具函数, 内部会调用 EventChannel.subscribe.

挂起可取消

本函数的挂起过程可以被取消. 这意味着若在 CoroutineScope.launch 中使用本函数, 则 launch 启动的 Job 可以通过 Job.cancel 取消 (停止), 届时本函数会抛出 CancellationException.

异常处理

filter 抛出的异常属于监听方异常, 将会由 nextEvent 原样重新抛出.

使用 Flow 的替代方法

在 Kotlin 可使用 EventChannel.asFlow 配合 Flow.filterFlow.first 实现与 nextEvent 相似的功能 (注意, Flow 方法将会使用 EventPriority.MONITOR 优先级).

示例:

val event: GroupMessageEvent = GlobalEventChannel.asFlow().filterIsInstance<GroupMessageEvent>().filter { it.sender.id == 123456 }.first()
// 上下两行代码等价
val event: GroupMessageEvent = GlobalEventChannel.filterIsInstance<GroupMessageEvent>().nextEvent(EventPriority.MONITOR) { it.sender.id == 123456 }

由于 Flow 拥有更多操作 (如 Flow.firstOrNull), 在不需要指定事件优先级时使用 Flow 拥有更高自由度.

Since

2.13

Parameters

intercept

是否拦截, 传入 true 时表示拦截此事件不让接下来的监听器处理, 传入 false 时表示让接下来的监听器处理

filter

过滤器. 返回 true 时表示得到了需要的实例. 返回 false 时表示继续监听