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

আপনি 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 এর অবস্থা ধরে রাখতে সক্ষম করে। এটি একটি SaveableStateProvider দিয়ে NavEntry কন্টেন্টকে র‍্যাপ করে, যা NavEntry কন্টেন্টের ভেতরের rememberSaveable কলগুলোকে সঠিকভাবে কাজ করতে সাহায্য করে।

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

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

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

ResultEventBusNavEntryDecorator ব্যবহার করে ফলাফল প্রেরণ করুন।

Navigation 3 1.2.0 থেকে শুরু করে, আপনি LocalResultEventBus কম্পোজিশন লোকাল ব্যবহার করে প্রতিটি NavEntry তে একটি ResultEventBus সরবরাহ করতে ResultEventBusNavEntryDecorator ব্যবহার করতে পারেন।

ডিফল্টরূপে, rememberResultEventBusNavEntryDecorator অভ্যন্তরীণভাবে rememberResultEventBus ব্যবহার করে তার নিজস্ব ResultEventBus ইনস্ট্যান্স তৈরি করে এবং মনে রাখে। যদি আপনার ডেকোরেটর হায়ারার্কির বাইরে (যেমন টপ-লেভেল অ্যাপ স্ক্যাফোল্ডিং-এ) ইভেন্ট বাস অ্যাক্সেস করার প্রয়োজন হয়, তাহলে আপনি rememberResultEventBus কল করে এবং এটিকে rememberResultEventBusNavEntryDecorator(resultEventBus) এ পাস করে ResultEventBus কে হোইস্ট করতে পারেন:

val resultEventBus = rememberResultEventBus()

NavDisplay(
    /* ... */
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus)
    )
)

ফলাফল পাঠানো ও পর্যবেক্ষণ করার বিষয়ে আরও বিস্তারিত জানতে, ‘ফলাফল ফেরত দিন’ দেখুন।

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

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

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

নিম্নলিখিত ক্ষেত্রে ডেকোরেটর ব্যবহার করবেন না:

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

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

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