প্রদত্ত ম্যাচিং টুলগুলো আপনার ব্যবহারের জন্য যথেষ্ট না হলে, আপনি 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>() )। এর ফলে কলাররা আনচেকড ডাউনকাস্টিং ছাড়াই আপনার কাস্টম রেজাল্ট প্রোপার্টিগুলো অ্যাক্সেস করতে পারে।
উদাহরণস্বরূপ, 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 } }