nextEvent
挂起当前协程, 直到监听到事件 E 的广播并通过 filter, 返回这个事件实例.
本函数是 EventChannel.subscribe 的衍生工具函数, 内部会调用 EventChannel.subscribe.
挂起可取消
本函数的挂起过程可以被取消. 这意味着若在 CoroutineScope.launch 中使用本函数, 则 launch 启动的 Job 可以通过 Job.cancel 取消 (停止), 届时本函数会抛出 CancellationException.
异常处理
filter 抛出的异常属于监听方异常, 将会由 nextEvent 原样重新抛出.
使用 Flow 的替代方法
在 Kotlin 可使用 EventChannel.asFlow 配合 Flow.filter 和 Flow.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
过滤器. 返回 true
时表示得到了需要的实例. 返回 false
时表示继续监听
挂起当前协程, 直到监听到事件 E 的广播并通过 filter, 返回这个事件实例.
本函数是 EventChannel.subscribe 的衍生工具函数, 内部会调用 EventChannel.subscribe.
挂起可取消
本函数的挂起过程可以被取消. 这意味着若在 CoroutineScope.launch 中使用本函数, 则 launch 启动的 Job 可以通过 Job.cancel 取消 (停止), 届时本函数会抛出 CancellationException.
异常处理
filter 抛出的异常属于监听方异常, 将会由 nextEvent 原样重新抛出.
使用 Flow 的替代方法
在 Kotlin 可使用 EventChannel.asFlow 配合 Flow.filter 和 Flow.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
是否拦截, 传入 true
时表示拦截此事件不让接下来的监听器处理, 传入 false
时表示让接下来的监听器处理
过滤器. 返回 true
时表示得到了需要的实例. 返回 false
时表示继续监听