创建自定义 DeepLinkMatcher 类

如果提供的匹配器不足以满足您的用例,您可以通过扩展 DeepLinkMatcher 类来创建自己的匹配器。

扩展 DeepLinkMatcher<T, R> 时,您必须指定两个类型实参:目标导航键类型 (T : Any) 和匹配结果类型 (R : DeepLinkMatcher.MatchResult<T>)。如果您的匹配器不需要自定义结果排名或额外元数据,请使用 DeepLinkMatcher.MatchResult<T> 作为第二个类型实参。

例如,下面是支持 tel URI(例如 tel:5550100)的 TelDeepLinkMatcher 的基本实现。由于 tel URI 是不透明的,因此 UriDeepLinkMatcher 不支持它们:

对 MatchResult 个自定义类进行排名

如果有一种有意义的方法可以比较自定义匹配器的匹配结果,您应该扩展 DeepLinkMatcher.MatchResult 并替换 compareTo 方法来对结果进行排名。

创建自定义 MatchResult 子类时,请更新匹配器的类声明,以将该子类指定为其第二个类型参数 R(例如 class TelDeepLinkMatcher : DeepLinkMatcher<DialerKey, TelMatchResult>())。这样,调用方就可以访问您的自定义结果属性,而无需进行未经检查的向下转型。

例如,为了支持 TelDeepLinkMatcher 中的通配符模式匹配,您可以实现 TelMatchResult,以确保完全匹配的排名高于通配符匹配。如果匹配器封装在 withBackStack 中,请在比较之前解封装 WrappedMatchResult,以便根据底层匹配结果评估优先级: