إذا لم تكن عناصر المطابقة المقدَّمة كافية لحالات الاستخدام، يمكنك إنشاء عناصر المطابقة الخاصة بك من خلال توسيع الفئة DeepLinkMatcher.
عند توسيع DeepLinkMatcher<T, R>، يجب تحديد وسيطَين للنوع: نوع مفتاح التنقّل الخاص بالوجهة (T : Any) ونوع نتيجة المطابقة (R : DeepLinkMatcher.MatchResult<T>). إذا لم يكن برنامج المطابقة بحاجة إلى ترتيب مخصّص للنتائج أو بيانات وصفية إضافية، استخدِم DeepLinkMatcher.MatchResult<T> كوسيط النوع الثاني.
على سبيل المثال، إليك عملية تنفيذ أساسية لـ TelDeepLinkMatcher تتوافق مع معرّفات الموارد المنتظمة (URI) من النوع 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 } }