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