اگر تطبیقدهندههای ارائهشده برای موارد استفاده شما کافی نیستند، میتوانید
با گسترش کلاس DeepLinkMatcher، تطبیقدهنده خودتان را ایجاد کنید.
هنگام گسترش دادن DeepLinkMatcher<T, R>، باید دو آرگومان نوع را مشخص کنید: نوع کلید پیمایش مقصد (T : Any) و نوع نتیجه مطابقت
(R : DeepLinkMatcher.MatchResult<T>). اگر مطابقتدهنده شما به رتبهبندی نتیجه سفارشی
یا فراداده اضافی نیاز ندارد، از DeepLinkMatcher.MatchResult<T> بهعنوان
آرگومان نوع دوم استفاده کنید.
برای مثال، در اینجا پیادهسازی پایه TelDeepLinkMatcher را میبینید که
از URIهای tel (مانند tel:5550100) پشتیبانی میکند. چون URIهای tel مبهم هستند،
UriDeepLinkMatcher از آنها پشتیبانی نمیکند:
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)) } }
رتبهبندی کلاسهای سفارشی MatchResult
اگر روش معناداری برای مقایسه نتایج مطابقت از تطبیقدهنده سفارشی شما وجود دارد،
باید DeepLinkMatcher.MatchResult را گسترش دهید و روش
compareTo را برای رتبهبندی نتایج لغو کنید.
وقتی زیرکلاس MatchResult سفارشی ایجاد میکنید، اعلان کلاس تطبیقدهنده را بهروز کنید تا آن زیرکلاس را بهعنوان پارامتر نوع دوم R (مانند class TelDeepLinkMatcher : DeepLinkMatcher<DialerKey, TelMatchResult>()) مشخص کند.
این کار به تماسگیرندگان اجازه میدهد بدون تبدیل نوع پایینرونده لغو انتخابشده به ویژگیهای نتیجه سفارشی شما دسترسی پیدا کنند.
برای مثال، برای پشتیبانی از مطابقت الگوی نویسه عام در TelDeepLinkMatcher، میتوانید
TelMatchResult را پیادهسازی کنید تا مطمئن شوید مطابقتهای دقیق رتبه بالاتری نسبت به
مطابقتهای نویسه عام دارند. اگر مطابقتدهنده در withBackStack قرار دارد، قبلاز مقایسه،
WrappedMatchResult را باز کنید تا اولویت نسبت به نتیجه مطابقت زیرین ارزیابی شود:
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 } }