nextEvent
挂起当前协程, 直到监听到事件 E 的广播并通过 filter, 返回这个事件实例.
本函数是 EventChannel.subscribe 的衍生工具函数, 内部会调用 EventChannel.subscribe.
挂起可取消
本函数的挂起过程可以被CancellableContinuation.cancel. 这意味着若在 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, 返回这个事件实例.
已弃用
该函数相当于 GlobalEventChannel.nextEvent. 不一定需要将所有被弃用的 nextEvent 都换成 GlobalEventChannel.nextEvent
, 请根据情况选择合适的 EventChannel.
See also
普通地监听一个事件
挂起当前协程, 并尝试从事件中同步一个值
Parameters
超时. 单位为毫秒. -1
为不限制.
过滤器. 返回 true
时表示得到了需要的实例. 返回 false
时表示继续监听
Throws
在超时后抛出.