Sağlanan eşleştiriciler kullanım alanlarınız için yeterli değilse DeepLinkMatcher sınıfını genişleterek kendi eşleştiricilerinizi oluşturabilirsiniz.
DeepLinkMatcher<T, R> öğesini genişletirken iki tür bağımsız değişken belirtmeniz gerekir: hedef gezinme anahtarı türü (T : Any) ve eşleşme sonucu türü (R : DeepLinkMatcher.MatchResult<T>). Eşleştiricinizin özel sonuç sıralamasına veya ek meta verilere ihtiyacı yoksa ikinci tür bağımsız değişken olarak DeepLinkMatcher.MatchResult<T> öğesini kullanın.
Örneğin, tel URI'lerini (ör. tel:5550100) destekleyen bir TelDeepLinkMatcher öğesinin temel uygulaması aşağıda verilmiştir. tel URI'leri opak olduğundan UriDeepLinkMatcher bunları desteklemez:
class TelDeepLinkMatcher : DeepLinkMatcher<DialerKey, DeepLinkMatcher.MatchResult<DialerKey>>() { override fun matchRequest(request: DeepLinkRequest): MatchResult<DialerKey>? { val uri = request.uri ?: return null if (uri.scheme != "tel") return null // Note: schemeSpecificPart is only available on Android val phoneNumber = uri.schemeSpecificPart ?: return null return MatchResult(DialerKey(phoneNumber = phoneNumber)) } }
Özel MatchResult sınıflarını sıralama
Özel eşleştiricinizdeki eşleşme sonuçlarını karşılaştırmanın anlamlı bir yolu varsa DeepLinkMatcher.MatchResult öğesini genişletmeli ve sonuçları sıralamak için compareTo yöntemini geçersiz kılmalısınız.
Özel bir MatchResult alt sınıfı oluşturduğunuzda, eşleştiricinizin sınıf bildirimini bu alt sınıfı ikinci tür parametresi olarak belirtecek şekilde güncelleyin R (ör. class TelDeepLinkMatcher : DeepLinkMatcher<DialerKey, TelMatchResult>()). Bu, arayanların özel sonuç özelliklerinize kontrolsüz aşağı dönüştürme olmadan erişmesini sağlar.
Örneğin, TelDeepLinkMatcher içinde joker karakter kalıbı eşleşmesini desteklemek için tam eşleşmelerin joker karakter eşleşmelerinden daha yüksek sıralanmasını sağlamak üzere TelMatchResult uygulayabilirsiniz. Eşleştirici withBackStack içine alınmışsa öncelik, temel eşleşme sonucuna göre değerlendirilebilmesi için karşılaştırmadan önce WrappedMatchResult öğesini kaldırın:
class TelMatchResult( key: DialerKey, val isExactMatch: Boolean, val patternLength: Int ) : DeepLinkMatcher.MatchResult<DialerKey>(key) { override fun compareTo(other: DeepLinkMatcher.MatchResult<DialerKey>): Int { // Unwrap if the other result is wrapped in a BackStackMatchResult or custom WrappedMatchResult val target = if (other is WrappedMatchResult<*>) other.matchResult else other if (target !is TelMatchResult) { // Determine precedence relative to other MatchResult types (e.g. UriMatchResult) return 1 } // An exact match wins over a wildcard/prefix match if (isExactMatch && !target.isExactMatch) return 1 if (!isExactMatch && target.isExactMatch) return -1 // The more specific (longer) pattern wins (e.g., tel:1800* versus tel:*) val lengthDiff = this.patternLength - target.patternLength if (lengthDiff != 0) { return lengthDiff } return 0 } }