মেটাডেটা দিয়ে আপনার অ্যাপ কনফিগার করা

Navigation 3-এ, আপনি NavEntry, Scene এবং NavDisplay-এর মতো বিভিন্ন লাইব্রেরি কম্পোনেন্টের মধ্যে আরবিট্রারি তথ্য শেয়ার করতে মেটাডেটা ব্যবহার করেন। সবচেয়ে প্রাথমিক পর্যায়ে, মেটাডেটা হল Map<String, Any>। তবে, লাইব্রেরি অতিরিক্ত অ্যাবস্ট্রাকশন প্রদান করে যাতে মেটাডেটা পড়া ও লেখা আরও সহজ ও টাইপ-সেফ হয়।

NavEntry মেটাডেটা প্রদান করুন

আপনার অ্যাপ সরাসরি NavEntry ইনস্ট্যান্স তৈরি করলে, আপনি metadata কনস্ট্রাক্টর প্যারামিটার ব্যবহার করে এন্ট্রির জন্য মেটাডেটা প্রদান করেন:

when (key) {
    is Home -> NavEntry(key, metadata = mapOf("key" to "value")) {}
}

আপনার অ্যাপ entryProvider DSL ব্যবহার করলে, আপনি entry ফাংশনের metadata প্যারামিটারের মাধ্যমে মেটাডেটা প্রদান করেন। এই ফাংশনের দুটি ওভারলোড আছে: একটি সরাসরি ম্যাপ নেয় এবং অন্যটি এমন একটি ল্যাম্বডা নেয় যা আর্গুমেন্ট হিসেবে এন্ট্রির কী পাস করে:

entry<Home>(metadata = mapOf("key" to "value")) { /* ... */ }
entry<Conversation>(metadata = { key: Conversation ->
    mapOf("key" to "value: ${key.id})")
}) { /* ... */ }

Scene মেটাডেটা প্রদান করুন

ডিফল্ট হিসেবে, Scene.metadata একটি কাস্টম গেটার ব্যবহার করে যা সেটির entries প্রপার্টির শেষ এন্ট্রির metadata রিটার্ন করে অথবা সেটি null হলে একটি খালি ম্যাপ রিটার্ন করে। Scene ইন্টারফেস প্রয়োগ করার সময়, প্রয়োজন অনুযায়ী আপনি এই ডিফল্ট আচরণ ওভাররাইড করতে পারবেন।

মেটাডেটা DSL ব্যবহার করা

লাইব্রেরির 1.1.0-beta01 রিলিজে চালু করা, মেটাডেটা ডোমেন-নির্দিষ্ট ভাষা (DSL) মেটাডেটা সেভ করার জন্য ব্যবহৃত Map<String, Any> তৈরি করার জন্য একটি টাইপ-সেফ বিল্ডার প্রদান করে।

মেটাডেটা কী নির্ধারণ করা

মেটাডেটা কী-এর সাথে যুক্ত ভ্যালুর ধরনকে সামঞ্জস্যপূর্ণ রাখতে DSL NavMetadataKey ইন্টারফেসের উপর নির্ভর করে।

মেটাডেটা কী নির্ধারণ করার কনভেনশন হল, সেগুলিকে ক্লাস—অথবা, ফাংশন বা কম্পোজ করার উপযুক্ত আইটেমের ক্ষেত্রে, সংশ্লিষ্ট অবজেক্ট—এর নেস্টেড অবজেক্ট হিসেবে অন্তর্ভুক্ত করা যা সেইসব কীয়ের সাথে যুক্ত ভ্যালু পড়বে:

// For classes such as scene strategies or nav entry decorators, you can define the keys
// as nested object.
class MySceneStrategy<T : Any> : SceneStrategy<T> {

    // ...

    object MyStringMetadataKey : NavMetadataKey<String>
}

// An example from NavDisplay.
// Because NavDisplay is a function, the metadata keys are defined in an object with the same name.
public object NavDisplay {

    public object TransitionKey :
        NavMetadataKey<AnimatedContentTransitionScope<Scene<*>>.() -> ContentTransform>
}

DSL ব্যবহার করে মেটাডেটা তৈরি করা

মেটাডেটা ম্যাপ তৈরি করতে, metadata ফাংশন ব্যবহার করুন, যা একটি ল্যাম্বডা প্যারামিটার নেয়। এই ল্যাম্বডার মধ্যে, NavMetadataKey ও সংশ্লিষ্ট ভ্যালু ব্যবহার করে ম্যাপে এন্ট্রি যোগ করতে put ফাংশন ব্যবহার করুন।

entry<Home>(
    metadata = metadata {
        put(NavDisplay.TransitionKey) { fadeIn() togetherWith fadeOut() }
        // An additional benefit of the metadata DSL is the ability to use conditional logic
        if (condition) {
            put(MySceneStrategy.MyStringMetadataKey, "Hello, world!")
        }
    }
) {
    // ...
}

মেটাডেটা কী ব্যবহার করে মেটাডেটা পড়া

মেটাডেটা DSL-এ NavMetadataKey-এর সাহায্যে মেটাডেটা পড়ার প্রক্রিয়া সহজ করার জন্য ফাংশনও দেওয়া আছে।

// import androidx.navigation3.runtime.contains
// import androidx.navigation3.runtime.get

val hasMyString: Boolean = metadata.contains(MySceneStrategy.MyStringMetadataKey)
val myString: String? = metadata[MySceneStrategy.MyStringMetadataKey]