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> sınıfını 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ştiriciniz özel sonuç sıralaması veya ek meta veri gerektirmiyorsa ikinci tür bağımsız değişken olarak DeepLinkMatcher.MatchResult<T> kullanın.
Örneğin, tel URI'larını (ör. tel:5550100) destekleyen bir TelDeepLinkMatcher için temel bir uygulama aşağıda verilmiştir. tel URI'ları 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ı sıralama
Özel eşleştiricinizden elde edilen eşleşme sonuçlarını karşılaştırmanın anlamlı bir yolu varsa DeepLinkMatcher.MatchResult sınıfını genişletmeniz ve sonuçları sıralamak için compareTo yöntemini geçersiz kılmanız gerekir.
Özel bir MatchResult alt sınıfı oluşturduğunuzda, eşleştiricinizin sınıf bildirimini güncelleyerek bu alt sınıfı ikinci tür parametresi R (ör. class TelDeepLinkMatcher : DeepLinkMatcher<DialerKey, TelMatchResult>()) olarak belirtin.
Bu sayede, arayanlar kontrol edilmeyen alt türe dönüştürme işlemi olmadan özel sonuç özelliklerinize erişebilir.
Örneğin, TelDeepLinkMatcher içinde joker karakter kalıbı eşleştirmeyi desteklemek için tam eşlemelerin joker karakter eşleşmelerinden daha yüksek sıralanmasını sağlayan bir TelMatchResult uygulayabilirsiniz. Eşleştirici withBackStack içine alınmışsa önceliğin temel eşleşme sonucuna göre değerlendirilmesi için karşılaştırmadan önce WrappedMatchResult öğesini açı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 } }