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