প্যাটার্নের সাথে হায়ারারকিক্যাল ইউআরআই মেলানো এবং আর্গুমেন্ট বের করার জন্য UriDeepLinkMatcher ব্যবহার করুন। এটি মিলে যাওয়া আর্গুমেন্টগুলোকে আপনার কী ক্লাসে ডিসিরিয়ালাইজ করার জন্য kotlinx.serialization উপর নির্ভর করে।
একটি UriDeepLinkMatcher তৈরি করতে, DeepLinkUri প্যাটার্ন এবং সংশ্লিষ্ট কী-এর জন্য সিরিয়ালাইজার প্রদান করুন:
@Serializable data class UserProfileKey(val id: String) : NavKey val userProfilePattern = DeepLinkUri("www.example.com/users/{id}") val userProfileMatcher = UriDeepLinkMatcher(userProfilePattern, serializer<UserProfileKey>()) val request = DeepLinkRequest(uri = "https://www.example.com/users/123") val matchResult = userProfileMatcher.match(request) val key = matchResult?.key // UserProfileKey(id = "123")
অ-ক্রমিক URI বা কাস্টম স্কিমের (যেমন tel: ) জন্য, কাস্টম ডিপ লিঙ্ক ম্যাচিং তৈরি করুন দেখুন।
সমর্থিত মিলের ধরণ
UriDeepLinkMatcher ইউআরআই-এর পাঁচটি উপাদানের (স্কিম, অথরিটি, পাথ, কোয়েরি এবং ফ্র্যাগমেন্ট) উপর ভিত্তি করে সেগুলোকে মেলায়। নিম্নলিখিত বিভাগগুলিতে প্রতিটি উপাদানের জন্য সমর্থিত প্যাটার্ন সিনট্যাক্স, আর্গুমেন্ট প্লেসহোল্ডার এবং মেলানোর নিয়ম বর্ণনা করা হয়েছে।
স্কিম মেলানো
URI প্যাটার্নে কোনো স্কিম উপস্থিত না থাকলে, http এবং https উভয়ই ম্যাচ হয়। একটি নির্দিষ্ট স্কিম ম্যাচ করার জন্য, প্যাটার্নে সেটি অন্তর্ভুক্ত করুন। ব্যতিক্রম হিসেবে, একটি প্যাটার্নে http স্কিম থাকলে তা http এবং https উভয় রিকোয়েস্ট URI-কেই ম্যাচ করে, অপরদিকে একটি প্যাটার্নে https থাকলে তা শুধুমাত্র https রিকোয়েস্টকেই ম্যাচ করে।
| প্যাটার্ন ইউআরআই | অনুরোধ URI | ম্যাচ |
|---|---|---|
www.example.com | https://www.example.com | ✅ |
www.example.com | http://www.example.com | ✅ |
http://www.example.com | http://www.example.com | ✅ |
http://www.example.com | https://www.example.com | ✅ |
https://www.example.com | http://www.example.com | ❌ |
myapp://www.example.com | myapp://www.example.com | ✅ |
কর্তৃত্ব মেলানো
UriDeepLinkMatcher ইউআরআই অথরিটির (হোস্ট এবং ঐচ্ছিক পোর্ট) উপর একটি কেস-ইনসেনসিটিভ এক্সাক্ট ম্যাচ সম্পাদন করে। অথরিটিতে প্লেসহোল্ডার বা ওয়াইল্ডকার্ড সমর্থিত নয়, এবং কোনো আর্গুমেন্ট এক্সট্র্যাক্ট করা হয় না:
| প্যাটার্ন ইউআরআই | অনুরোধ URI | ম্যাচ |
|---|---|---|
example.com | https://example.com | ✅ |
example.com | https://EXAMPLE.COM | ✅ |
example.com | https://sub.example.com | ❌ |
example.com | https://www.example.com | ❌ |
example.com | https://example.com:8080 | ❌ |
example.com:8080 | https://example.com:8080 | ✅ |
example.com:8080 | https://example.com | ❌ |
পথ মেলানো
নিম্নলিখিত পাথ প্যাটার্নগুলি সমর্থিত:
| প্যাটার্ন ইউআরআই | অনুরোধ URI | ম্যাচ | নিষ্কাশিত যুক্তি |
|---|---|---|---|
www.example.com/users | https://www.example.com/users | ✅ | কোনোটিই না |
www.example.com/users/{id} | https://www.example.com/users/123 | ✅ | id : "123" |
www.example.com/users/{first}-{last} | https://www.example.com/users/john-doe | ✅ | first : "john" , last : "doe" |
www.example.com/users/{id}/profile | https://www.example.com/users//profile | ✅ | id : "" (খালি স্ট্রিং) |
www.example.com/users/user_{id} | https://www.example.com/users/user_123 | ✅ | id : "123" |
www.example.com/users/{userId}/posts/{postId} | https://www.example.com/users/123/posts/456 | ✅ | userId : "123" , postId : "456" |
www.example.com/users/.* | https://www.example.com/users/john-doe | ✅ | কোনোটিই না |
www.example.com/users | https://www.example.com/users/ | ❌ (শেষের স্ল্যাশ একটি অতিরিক্ত অংশ তৈরি করে) | প্রযোজ্য নয় |
কোয়েরি মেলানো
রিকোয়েস্ট URI-তে কোয়েরি প্যারামিটারের ক্রম প্যাটার্ন URI-এর ক্রমের সাথে মেলানোর প্রয়োজন নেই। এছাড়াও, যে প্যারামিটারগুলো রিকোয়েস্ট URI-তে উপস্থিত কিন্তু প্যাটার্ন URI-তে নেই, সেগুলো উপেক্ষা করা হয়।
নিম্নলিখিত কোয়েরি প্যারামিটার প্যাটার্নগুলো সমর্থিত:
| প্যাটার্ন ইউআরআই | অনুরোধ URI | নিষ্কাশিত যুক্তি |
|---|---|---|
www.example.com/users?name={name} | https://www.example.com/users?name=john | name : "john" |
www.example.com/users?name={name} | https://www.example.com/users?name= | name : "" (খালি স্ট্রিং) |
www.example.com/users?{rawQuery} | https://www.example.com/users?anything&else | rawQuery : ["anything", "else"] |
www.example.com/users?type=user_{id} | https://www.example.com/users?type=user_123 | id : "123" |
www.example.com/users?name={first}_{last} | https://www.example.com/users?name=john_doe | first : "john" , last : "doe" |
www.example.com/users?list={list} | https://www.example.com/users?list=10&list=20 | list : ["10", "20"] |
www.example.com/users?name={name}&{other} | https://www.example.com/users?name=john&tab=info | name : "john" , other : ["tab=info"] |
www.example.com/users?type=user_.* | https://www.example.com/users?type=user_admin | type : "admin" |
খণ্ডাংশ মেলানো
নিম্নলিখিত ফ্র্যাগমেন্ট প্যাটার্ন প্রকারগুলি সমর্থিত:
| প্যাটার্ন ইউআরআই | অনুরোধ URI | নিষ্কাশিত যুক্তি |
|---|---|---|
www.example.com/#section1 | https://www.example.com/#section1 | কোনোটিই না |
www.example.com/#section_{id} | https://www.example.com/#section_123 | id : "123" |
www.example.com/#section_.* | https://www.example.com/#section_123 | কোনোটিই না |
সমর্থিত ডেটা প্রকার
UriDeepLinkMatcher ইউআরআই আর্গুমেন্টগুলোকে প্রিমিটিভ টাইপ, এনাম, কালেকশন এবং কাস্টম অবজেক্টে ডিসিরিয়ালাইজ করা সমর্থন করে। সিরিয়ালাইজেশন দুটি শ্রেণীতে বিভক্ত:
- স্ট্যান্ডার্ড সিরিয়ালাইজেশন :
kotlinx.serializationব্যবহার করে নিম্নলিখিত রূপে ডিসিরিয়ালাইজ করে:- প্রিমিটিভ (
Boolean,Int,Long,Float,Double,Char,Byte,Short) এবংString - এনাম
- প্রিমিটিভ, স্ট্রিং বা এনামের
Set,ListবাArray - নেস্টেড
@Serializableক্লাস (যার প্রোপার্টিগুলো স্বতন্ত্র URI প্লেসহোল্ডারে পরিণত হয়)
- প্রিমিটিভ (
-
DeepLinkSerializerসাহায্যে কাস্টম সিরিয়ালাইজেশন : একটি এককStringএবং কাস্টম অবজেক্ট, এক্সটার্নাল টাইপ (যেমনjava.time.LocalDate), বা কাস্টম-ডিলিমিটেড কালেকশনের মধ্যে রূপান্তর করে।
স্ট্যান্ডার্ড সিরিয়ালাইজেশন
UriDeepLinkMatcher কোনো কাস্টম সিরিয়ালাইজার ইমপ্লিমেন্টেশনের প্রয়োজন ছাড়াই স্ট্যান্ডার্ড টাইপ এবং ফ্ল্যাটেনড স্ট্রাকচারের জন্য সরাসরি কাজ করে।
প্রিমিটিভ এবং স্ট্রিং
UriDeepLinkMatcher স্বয়ংক্রিয়ভাবে প্রিমিটিভ টাইপ ( Boolean , Int , Long , Float , Double , Char , Byte , Short ) এবং String ডিকোড করে:
@Serializable data class UserProfileKey(val id: Int) : NavKey val matcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ) val request = DeepLinkRequest(uri = "https://www.example.com/users/123") val key = matcher.match(request)?.key // UserProfileKey(id = 123)
এনাম
Enum এলিমেন্টের নামগুলোর সাথে Enum ভ্যালুগুলো কেস-সেনসিটিভভাবে মেলানো হয়:
enum class SortOrder { RELEVANCE, DATE, POPULARITY } @Serializable data class ProductsKey(val sort: SortOrder) : NavKey val matcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/products?sort={sort}"), serializer<ProductsKey>() ) val request = DeepLinkRequest(uri = "https://www.example.com/products?sort=DATE") val key = matcher.match(request)?.key // ProductsKey(sort = SortOrder.DATE)
পুনরাবৃত্ত কোয়েরি সংগ্রহ
পুনরাবৃত্ত কী-সহ কোয়েরি প্যারামিটার (যেমন ?id=10&id=20 ) স্বয়ংক্রিয়ভাবে List<T> , Set<T> , বা Array<T> তে ডিসিরিয়ালাইজ হয়, যেখানে T হলো একটি প্রিমিটিভ টাইপ, String , বা enum।
@Serializable data class FilteredItemsKey(val ids: List<Int>) : NavKey val matcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/items?id={ids}"), serializer<FilteredItemsKey>() ) val request = DeepLinkRequest(uri = "https://www.example.com/items?id=10&id=20") val key = matcher.match(request)?.key // FilteredItemsKey(ids = listOf(10, 20))
নেস্টেড @Serializable ক্লাস
যখন কোনো NavKey এমন কোনো প্রপার্টি থাকে যার টাইপ অন্য একটি @Serializable ক্লাস, তখন UriDeepLinkMatcher তার প্রপার্টিগুলোকে ফ্ল্যাটেন করে, ফলে নেস্টেড ক্লাসের প্রতিটি প্রপার্টি সরাসরি একই নামের একটি স্বতন্ত্র URI প্যারামিটারের সাথে ম্যাপ হয়:
enum class SortOrder { RELEVANCE, DATE, POPULARITY } @Serializable data class SearchFilters( val category: String, val sortBy: SortOrder = SortOrder.RELEVANCE ) @Serializable data class SearchKey( val query: String, val page: Int = 1, // Flattened into {category} and {sortBy} val filters: SearchFilters ) : NavKey val matcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/search?q={query}&page={page}&category={category}&sortBy={sortBy}"), serializer<SearchKey>() ) val request = DeepLinkRequest(uri = "https://www.example.com/search?q=kotlin&category=books&sortBy=DATE") val key = matcher.match(request)?.key // SearchKey(query = "kotlin", page = 1, filters = SearchFilters(category = "books", sortBy = SortOrder.DATE))
DeepLinkSerializer ব্যবহার করে কাস্টম সিরিয়ালাইজেশন
কাস্টম অবজেক্ট (যেমন Filter(key = "brand", value = "pixel") ), এক্সটার্নাল টাইপ (যেমন java.time.LocalDate ), বা কাস্টম ডিলিমিটেড স্ট্রিং (যেমন কমা-বিভক্ত মান) ডিসিরিয়ালাইজ করতে, DeepLinkSerializer<T> এক্সটেন্ড করুন।
DeepLinkSerializer<T> হলো একটি অ্যাবস্ট্রাক্ট KSerializer<T> যা একটি String এবং T মধ্যে রূপান্তর করে:
abstract class DeepLinkSerializer<T : Any> : KSerializer<T> {
abstract val serialName: String
abstract fun deserialize(value: String): T
abstract fun serialize(value: T): String
}
উদাহরণস্বরূপ, নিম্নলিখিত কোড স্নিপেটগুলিতে ব্যবহৃত Filter এবং FilterSerializer সংজ্ঞাগুলি বিবেচনা করুন:
@Serializable data class Filter(val key: String, val value: String) object FilterSerializer : DeepLinkSerializer<Filter>() { override val serialName: String = "com.example.Filter" override fun deserialize(value: String): Filter { val parts = value.split(":", limit = 2) if (parts.size < 2) { throw SerializationException("Invalid filter: $value. Expected key:value.") } return Filter(key = parts[0], value = parts[1]) } override fun serialize(value: Filter): String = "${value.key}:${value.value}" }
একক কাস্টম বস্তু
একটিমাত্র URI প্যারামিটার স্ট্রিং (যেমন ?filter=brand:google ) থেকে কোনো অবজেক্ট ডিকোড করতে, প্রপার্টিটিকে @Serializable(with = ...) দিয়ে অ্যানোটেট করুন:
@Serializable data class CatalogKey( @Serializable(with = FilterSerializer::class) val filter: Filter ) : NavKey val matcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/catalog?filter={filter}"), serializer<CatalogKey>() ) val request = DeepLinkRequest(uri = "https://www.example.com/catalog?filter=brand:google") val key = matcher.match(request)?.key // CatalogKey(filter = Filter("brand", "google"))
পুনরাবৃত্ত কোয়েরি প্যারামিটারে কাস্টম অবজেক্ট
পুনরাবৃত্ত কোয়েরি প্যারামিটারগুলোকে কাস্টম অবজেক্টের ( List<T> , Set<T> , বা Array<T> ) একটি সংগ্রহে ডিসিরিয়ালাইজ করতে, এলিমেন্ট টাইপ T এর জন্য DeepLinkSerializer<T> ইমপ্লিমেন্ট করুন এবং প্রপার্টির টাইপ আর্গুমেন্টটিকে @Serializable(with = ...) দিয়ে অ্যানোটেট করুন:
@Serializable data class SearchResultsKey( val query: String, val filters: List<@Serializable(with = FilterSerializer::class) Filter> = emptyList() ) : NavKey val searchResultsPattern = DeepLinkUri("www.example.com/search?q={query}&filter={filters}") val searchResultsMatcher = UriDeepLinkMatcher(searchResultsPattern, serializer<SearchResultsKey>()) val request = DeepLinkRequest(uri = "https://www.example.com/search?q=phone&filter=brand:google&filter=color:hazel") val matchResult = searchResultsMatcher.match(request) val key = matchResult?.key // SearchResultsKey(query = "phone", filters = listOf(Filter("brand", "google"), Filter("color", "hazel")))
একক প্যারামিটারে সীমাবদ্ধ সংগ্রহ
কমা দ্বারা পৃথক করা বা কাস্টম-ডিলিমিটেড ভ্যালু (যেমন ?ids=1,2,3 ) একটি কালেকশনে পার্স করতে, সম্পূর্ণ কালেকশন টাইপের জন্য DeepLinkSerializer ইমপ্লিমেন্ট করুন এবং প্রপার্টিটিকে @Serializable(with = ...) দিয়ে অ্যানোটেট করুন:
object IntListCsvSerializer : DeepLinkSerializer<List<Int>>() { override val serialName: String = "com.example.IntListCsv" override fun deserialize(value: String): List<Int> { if (value.isEmpty()) return emptyList() return value.split(",").map { it.trim().toInt() } } override fun serialize(value: List<Int>): String = value.joinToString(",") } @Serializable data class ItemListKey( @Serializable(with = IntListCsvSerializer::class) val ids: List<Int> ) : NavKey val itemListPattern = DeepLinkUri("www.example.com/items/{ids}") val itemListMatcher = UriDeepLinkMatcher(itemListPattern, serializer<ItemListKey>()) val request = DeepLinkRequest(uri = "https://www.example.com/items/10,20,30") val key = itemListMatcher.match(request)?.key // ItemListKey(ids = listOf(10, 20, 30))
যুক্তির বৈধতা এবং মিলের ফলাফল
UriDeepLinkMatcher অমিল ( null রিটার্ন করে যাতে অন্যান্য ম্যাচিং টুল চেষ্টা করা যায়) এবং অসমর্থিত কনফিগারেশনের (একটি এক্সেপশন থ্রো করে) মধ্যে পার্থক্য করতে পারে।
অমিল
যখন আগত অনুরোধের URI প্যাটার্ন বা প্রকারের প্রয়োজনীয়তা পূরণ করে না, তখন একটি অমিল ঘটে:
- প্রয়োজনীয় প্যারামিটার অনুপস্থিত : ডিফল্ট মানবিহীন নন-নাল কী প্রপার্টি, যার সংশ্লিষ্ট URI প্যারামিটারগুলো রিকোয়েস্ট URI-তে অনুপস্থিত।
- টাইপ পার্সিং ব্যর্থতা : নিষ্কাশিত আর্গুমেন্ট মান যা প্রত্যাশিত প্রপার্টি টাইপে পার্স করা যায় না (উদাহরণস্বরূপ, একটি
Intপ্রপার্টির জন্য"abc")।
যখন কোনো অমিল ঘটে, UriDeepLinkMatcher.match null রিটার্ন করে, যার ফলে পরবর্তী ম্যাচিং ফাংশনগুলো মূল্যায়ন করা যায়।
ডিফল্ট মান, নেস্টেড অবজেক্ট এবং এনাম দিয়ে কনফিগার করা একটি কী ক্লাস ও ম্যাচারের কথা বিবেচনা করুন:
enum class MapLayer { STANDARD, SATELLITE, TERRAIN } @Serializable data class LayerOptions( val style: String, val layer: MapLayer = MapLayer.STANDARD ) @Serializable data class MapKey( val location: String, val zoom: Int = 12, val options: LayerOptions ) : NavKey val matcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/map/{location}?zoom={zoom}&style={style}&layer={layer}"), serializer<MapKey>() )
নিম্নলিখিত সারণিতে বিভিন্ন অনুরোধ URI-এর জন্য মিলযুক্ত ফলাফল দেখানো হয়েছে:
| অনুরোধ URI | ডিকোডিং ফলাফল | ম্যাচের ফলাফল |
|---|---|---|
https://www.example.com/map/paris?zoom=15&style=dark&layer=SATELLITE | সফল (সমস্ত প্যারামিটার সরবরাহ করা হয়েছে) | UriMatchResult(MapKey("paris", 15, LayerOptions("dark", MapLayer.SATELLITE))) |
https://www.example.com/map/paris?style=dark | সফল ( zoom ডিফল্ট 12 , layer STANDARD ) | UriMatchResult(MapKey("paris", 12, LayerOptions("dark", MapLayer.STANDARD))) |
https://www.example.com/map/paris?zoom=&style=dark | সফল (খালি ঐচ্ছিক কোয়েরি প্যারামিটার ডিফল্ট 12 ব্যবহার করে) | UriMatchResult(MapKey("paris", 12, LayerOptions("dark", MapLayer.STANDARD))) |
https://www.example.com/map?style=dark | অমিল (প্রয়োজনীয় location প্যারামিটার অনুপস্থিত) | null |
https://www.example.com/map/paris?zoom=close&style=dark | অমিল ( "close" একটি Int নয় ) | null |
https://www.example.com/map/paris?style=dark&layer=HYBRID | অমিল ( "HYBRID" enum-এ নেই) | null |
অসমর্থিত কনফিগারেশন
আপনার কী ক্লাসে যদি অসমর্থিত ডেটা টাইপ থাকে, তাহলে UriDeepLinkMatcher ম্যাচিং করার সময় null রিটার্ন করার পরিবর্তে একটি এক্সেপশন থ্রো করে।
- ম্যাপ এবং বহুমাত্রিক কালেকশন :
UriDeepLinkMatcherশুধুমাত্রDeepLinkSerializerদিয়ে অ্যানোটেট করা প্রিমিটিভ, স্ট্রিং, এনাম বা কাস্টম টাইপের একমাত্রিক কালেকশন সমর্থন করে।MapটাইপIllegalArgumentExceptionথ্রো করে, অন্যদিকে নেস্টেড কালেকশন (যেমনList<List<String>>)SerializationExceptionথ্রো করে। - টীকা ছাড়া কাস্টম অবজেক্ট কালেকশন : কাস্টম টাইপের কালেকশন (যেমন
List<Filter>) একটিSerializationExceptionথ্রো করে, যদি না এলিমেন্ট টাইপটিDeepLinkSerializerদিয়ে টীকাযুক্ত থাকে। - আনফ্ল্যাটেনড নেস্টেড ক্লাস :
DeepLinkSerializerছাড়া নেস্টেড@Serializableক্লাসগুলোকে কোনো একটিমাত্র প্লেসহোল্ডারে (যেমন?user={user}) ম্যাপ করা যায় না।
// Throws IllegalArgumentException: Map decoding is not supported. @Serializable data class InvalidKey(val tags: Map<String, String>) : NavKey // Throws SerializationException: Only collections of primitives are supported. @Serializable data class InvalidKey(val filters: List<Filter>) : NavKey
UriMatchResult তুলনা
UriMatchResult ইনস্ট্যান্সগুলোকে নিম্নলিখিত মানদণ্ড অনুসারে ক্রমানুসারে র্যাঙ্ক করা হয়:
- MatchResult টাইপ :
UriMatchResultঅন্যান্যMatchResultটাইপের চেয়ে উচ্চতর র্যাঙ্কে রয়েছে। - সঠিক পথ : আক্ষরিক পথের মিলগুলো প্লেসহোল্ডার বা ওয়াইল্ডকার্ড মিলের চেয়ে উচ্চতর র্যাঙ্ক পায়।
- পাথ আর্গুমেন্টের সংখ্যা : যেগুলোর পাথ আর্গুমেন্টের সংখ্যা বেশি, সেগুলোর র্যাঙ্ক উচ্চতর হয়।
- আর্গুমেন্টের উপস্থিতি : যে ম্যাচগুলোতে আর্গুমেন্ট থাকে, সেগুলোর র্যাঙ্ক আর্গুমেন্ট না থাকা ম্যাচগুলোর চেয়ে বেশি হয়।
- মোট আর্গুমেন্ট সংখ্যা : আর্গুমেন্টগুলোর (পাথ, কোয়েরি, ফ্র্যাগমেন্ট) মোট সংখ্যাই চূড়ান্ত নির্ণায়ক।
UriDeepLinkMatcher কাস্টমাইজ করুন
UriDeepLinkMatcher একটি open ক্লাস যা থেকে সাবক্লাস তৈরি করে আপনি URI ম্যাচিং এবং আর্গুমেন্ট এক্সট্র্যাকশনের আচরণ কাস্টমাইজ করতে পারেন:
-
matchRequest: আগতDeepLinkRequestজন্য শীর্ষ-স্তরের ম্যাচিং এন্ট্রি পয়েন্ট। URI ম্যাচিংয়ের আগে রিকোয়েস্ট এক্সট্রাগুলো পরীক্ষা করতে বা কাস্টম পূর্বশর্ত প্রয়োগ করতে এটি ওভাররাইড করুন। -
matchUri: কনফিগার করা প্যাটার্নের সাথেDeepLinkUriকে মেলায়।super.matchUriকল করার আগে আগত URI-গুলিকে ইন্টারসেপ্ট ও স্বাভাবিক করার জন্য (উদাহরণস্বরূপ, ডাইনামিক সাবডোমেইন বা পুরোনো পাথ ফরম্যাট পুনর্লিখন) এটি ওভাররাইড করুন। -
matchArguments: প্রদত্তserializerব্যবহার করে নিষ্কাশিত পাথ, কোয়েরি, এবং ফ্র্যাগমেন্ট আর্গুমেন্ট ম্যাপগুলোকে একটি নেভিগেশন কী ইনস্ট্যান্সে ডিসিরিয়ালাইজ করে। কী ইনস্ট্যানসিয়েশনের আগে ডাইনামিক ভ্যালু ইনজেক্ট করতে বা আর্গুমেন্ট ট্রান্সফর্ম করতে এটি ওভাররাইড করুন।
নিম্নলিখিত উদাহরণটি ম্যাচিং করার আগে লিগ্যাসি ইউআরএল পাথ প্রিফিক্সগুলোকে স্বাভাবিক করার জন্য UriDeepLinkMatcher সাবক্লাস করার পদ্ধতি প্রদর্শন করে:
class LegacyPrefixUriDeepLinkMatcher<T : Any>( uriPattern: DeepLinkUri, serializer: KSerializer<T> ) : UriDeepLinkMatcher<T>(uriPattern, serializer) { override fun matchUri(uri: DeepLinkUri): UriMatchResult<T>? { val path = uri.path val normalizedUri = if (path != null && path.startsWith("/legacy/")) { DeepLinkUri(uri.toString().replaceFirst("/legacy", "")) } else { uri } return super.matchUri(normalizedUri) } }