Key

interface Key<E : Event>

一个事件类型的Key。所有的计划对外的事件类型都必须通过 伴生对象 实现此类型并提供一个事件唯一的ID名称。 并非所有的事件接口 Event 的类型都能够允许被监听,有些事件类型可能仅用做标记或者由于其他原因无法/不允许被直接监听, 因此在事件调度中,需要通过 Key 来判断事件类型与其之间的继承关系。

所有事件的 Key.id 必须尽可能保证唯一,因此建议对ID进行命名的时候使用较为特殊的命名方式以杜绝出现ID重复。 id重复不一定会出现异常提示,但是在使用 isSub 等方法的时候,很有可能会出现缓存内容混乱进而导致引发预期外的异常。

事件类型可以继承,且允许多继承,实现方可以通过 isSub 来判断当前事件是否为某个类型的子类型。

比如

val event: MessageEvent = ...
val isSub: Boolean = MessageEvent.Key isSub Event.Key

Key 的继承关系是单向传递的,因此你能够通过一个key找到它继承的所有父类型,但是无法反向查找。

当一个事件提供伴生Key的时候,E 建议且应当与当前事件类型一致, 因为在 Key.getKey 等通过类型获取Key的场景下,均默认为 Key 的类型与当前事件类型一致。 如下所示:

interface MyEvent : Event {
companion object Key: Event.Key<MyEvent> {
// ...
}
}

See also

Types

Link copied to clipboard
object Companion

Functions

Link copied to clipboard
abstract fun safeCast(value: Any): E?

将一个提供的类型转化为当前的目标事件。 如果得到null,则说明无法被转化。

Properties

Link copied to clipboard
abstract val id: CharSequenceID

此事件的ID,需要是唯一的。假若在事件注册时出现了ID相同但不是同一个Key的情况将会导致异常。

Link copied to clipboard
abstract val parents: Set<Event.Key<*>>

此事件所继承的所有父事件。 此属性应当是不可变的,不应在运行期内发生变更。

Inheritors

Link copied to clipboard
Link copied to clipboard

Extensions

Link copied to clipboard
operator fun Event.Key<*>.contains(parentIdMaybe: String): Boolean
operator fun Event.Key<*>.contains(parentIdMaybe: ID): Boolean

判断当前类型是否为提供类型的子类型。

Link copied to clipboard
infix fun Event.Key<*>.isSub(from: Event.Key<*>): Boolean

检测当前接收器是否为 from 的子类型。