গন্তব্যস্থলে লজিক বা র‍্যাপার প্রয়োগ করুন

আপনি NavEntryDecorator ক্লাস ব্যবহার করে অতিরিক্ত তথ্য প্রদান করতে পারেন অথবা গন্তব্যস্থলে একই যুক্তি প্রয়োগ করতে পারেন। এই ক্লাসটি প্রতিটি NavEntry একটি কম্পোজেবল ফাংশন সহ একটি ব্যাক স্ট্যাকে মোড়ানো হয়। অন্যভাবে বলতে গেলে, এটি এন্ট্রির বিষয়বস্তুকে সাজায়

একটি কাস্টম ডেকোরেটর তৈরি করুন

একটি ডেকোরেটর তৈরি করতে, NavEntryDecorator ক্লাসটি প্রসারিত করুন এবং নিম্নলিখিত পদ্ধতিগুলি ওভাররাইড করুন:

  • decorate - একটি কম্পোজেবল ল্যাম্বডা যা আপনার ব্যাক স্ট্যাকের প্রতিটি NavEntry জন্য ডাকা হয়। এটি NavEntry একটি প্যারামিটার হিসেবে গ্রহণ করে। এটি আপনাকে এমন স্টেট অবজেক্ট তৈরি করতে দেয় যা এন্ট্রির contentKey এর সাথে সংযুক্ত থাকে। আপনি CompositionLocalProvider ব্যবহার করে এন্ট্রির কন্টেন্টের উপর নির্ভরতা প্রদান করতে পারেন। আপনি একটি কম্পোজেবল ফাংশন দিয়ে কন্টেন্টকে ঘিরে রাখতে পারেন, অথবা পার্শ্ব প্রতিক্রিয়া ট্রিগার করতে পারেন। এই পদ্ধতিতে আপনার সর্বদা entry.Content() কল করা উচিত।
  • onPop - একটি কলব্যাক যা ব্যাক স্ট্যাক থেকে একটি NavEntry সরানো হলে এবং কম্পোজিশন ছেড়ে গেলে আহ্বান করা হয়। এটি সরানো এন্ট্রির contentKey গ্রহণ করে। সেই এন্ট্রির সাথে সম্পর্কিত যেকোনো অবস্থা সনাক্ত করতে এবং পরিষ্কার করতে contentKey ব্যবহার করুন।

নিম্নলিখিত উদাহরণটি একটি কাস্টম ডেকোরেটর তৈরি করতে NavEntryDecorator ক্লাসকে প্রসারিত করে।

// import androidx.navigation3.runtime.NavEntryDecorator
class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>(
    decorate = { entry ->
        Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated")
        entry.Content()
    },
    onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") }
)

যদি আপনার ডেকোরেটরের স্টেট অ্যাক্সেসের প্রয়োজন হয়, তাহলে একটি কম্পোজেবল ফাংশন তৈরি করুন যা সেই স্টেট তৈরি করে এবং তারপর ডেকোরেটর তৈরি করতে এটি ব্যবহার করুন। একটি উদাহরণ বাস্তবায়নের জন্য, rememberSaveableStateHolderNavEntryDecorator এর সোর্স কোড দেখুন। এটি স্টেট তৈরি করে - একটি SaveableStateHolder - এবং ডেকোরেটর তৈরি করতে এটি ব্যবহার করে।

একটি ব্যাক স্ট্যাক সাজান

একবার আপনি আপনার NavEntryDecorator তৈরি করে ফেললে, আপনার ব্যাক স্ট্যাকের এন্ট্রিগুলিকে দুটি উপায়ের একটিতে সাজান:

  • rememberDecoratedNavEntries ব্যবহার করুন। এই ফাংশনটি তখন কার্যকর যখন আপনার একাধিক ব্যাক স্ট্যাক থাকে, প্রতিটির নিজস্ব ডেকোরেটরের সেট থাকে (আরও বিস্তারিত জানার জন্য এই কোড রেসিপিটি দেখুন)। ফাংশনটি NavEntry এর একটি সজ্জিত তালিকা প্রদান করে যা আপনি NavDisplay সাথে ব্যবহার করতে পারেন।
  • entryDecorators প্যারামিটার ব্যবহার করে আপনার ডেকোরেটর সরাসরি NavDisplay এ সরবরাহ করুন। NavDisplay হুডের নিচে rememberDecoratedNavEntries কল করে এবং সজ্জিত এন্ট্রিগুলি প্রদর্শন করে।

ডিফল্ট ডেকোরেটর অন্তর্ভুক্ত করুন

নেভিগেশন ৩-এ SaveableStateHolderNavEntryDecorator নামে একটি ডিফল্ট ডেকোরেটর রয়েছে যা কনফিগারেশন পরিবর্তন এবং প্রক্রিয়া মৃত্যুর মাধ্যমে NavEntry এর অবস্থা ধরে রাখতে সক্ষম করে। এটি NavEntry কন্টেন্টকে SaveableStateProvider দিয়ে মোড়ানো করে, যা NavEntry কন্টেন্টের ভিতরে থাকা rememberSaveable কলগুলিকে সঠিকভাবে কাজ করতে সক্ষম করে।

যদি আপনার ডেকোরেটর SaveableStateProvider প্রদান না করে, তাহলে আপনার সরবরাহকৃত ডেকোরেটরের তালিকায় প্রথম ডেকোরেটর হিসেবে SaveableStateHolderNavEntryDecorator অন্তর্ভুক্ত করা উচিত। এটি rememberSaveableStateHolderNavEntryDecorator ব্যবহার করে তৈরি করা হয়েছে।

উদাহরণস্বরূপ:

// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
NavDisplay(
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        remember { CustomNavEntryDecorator() }
    ),
    // ...
)

কখন ডেকোরেটর ব্যবহার করবেন

একটি ডেকোরেটর ব্যবহার করুন:

  • ব্যাক স্ট্যাকের প্রতিটি NavEntry এর জন্য একটি নির্ভরতা তৈরি করুন। উদাহরণস্বরূপ, ViewModelStoreNavEntryDecorator প্রতিটি NavEntry এর জন্য একটি ViewModelStore তৈরি করে।
  • একাধিক NavEntry গুলিতে একটি বস্তুকে স্কোপ করুন। উদাহরণস্বরূপ, একাধিক এন্ট্রির মধ্যে একটি ViewModel ভাগ করে নেওয়া।
  • একাধিক NavEntry এর জন্য একই কাজ সম্পাদন করুন। উদাহরণস্বরূপ, প্রতিটি এন্ট্রির জন্য লগিং, ডিবাগিং বা ট্রেসিং অপারেশন সম্পাদন করা।
  • একই কম্পোজেবল ফাংশন দিয়ে NavEntry গুলি মোড়ানো।
  • NavEntry এর সাথে সম্পর্কিত ক্লিন আপ স্টেট। উদাহরণস্বরূপ, যখন ব্যাক স্ট্যাক থেকে একটি এন্ট্রি সরানো হয় তখন ViewModelStoreNavEntryDecorator তার সাথে সম্পর্কিত ViewModelStore সাফ করে।

ডেকোরেটর ব্যবহার করবেন না:

  • একটি একক NavEntry তে নির্ভরতা স্থানান্তর করুন।
  • এমন নির্ভরতা প্রদান করুন যার পরিধি ব্যাক স্ট্যাকের চেয়ে বিস্তৃত।

এই উভয় ক্ষেত্রেই, NavEntry তৈরি করার সময় সরাসরি নির্ভরতা পাস করুন।

আরও কোড উদাহরণের জন্য, NavEntryDecorator দেখুন।