ডিসপ্যাচার সেট-আপ করা

শক্তিশালী নেভিগেশন সিস্টেম প্রয়োগ করতে, আপনার অ্যাপের ব্যাক জেসচার ও অন্যান্য নেভিগেশন সিগন্যাল ম্যানেজ করার জন্য একটি সেন্ট্রালাইজড উপায় প্রয়োজন। এই পৃষ্ঠা থেকে জানা যায় যে কীভাবে আপনার অ্যাপ্লিকেশন জুড়ে নেভিগেশন ইভেন্ট কোঅর্ডিনেট ও ডিস্ট্রিবিউট করতে NavigationEventDispatcher ব্যবহার করতে হয়।

NavigationEventDispatcher ঘোষণা করুন

NavigationEventDispatcher হল NavigationEvent লাইব্রেরির কেন্দ্রীয় উপাদান। এটি একটি ইভেন্ট হাব হিসেবে কাজ করে যা আপনার অ্যাপের মধ্যে রেজিস্টার করা লিসনারদের কাছে নেভিগেশন সংক্রান্ত ইভেন্ট, যেমন, ব্যাক জেসচার ও নেভিগেশন ট্রানজিশন ডিসপ্যাচ করে। নেভিগেশন পরিবর্তন বা সিস্টেম-পরিচালিত নেভিগেশন অ্যাকশনের প্রতি প্রতিক্রিয়া জানাতে কম্পোনেন্ট এইসব ইভেন্টে সাবস্ক্রাইব করতে পারে।

আপনাকে a NavigationEventDispatcherOwner-এর মাধ্যমে NavigationEventDispatcher ইনস্ট্যান্স প্রদান করতে হবে। এটি নিশ্চিত করে যে আপনার অ্যাপের বিভিন্ন অংশ একই ডিসপ্যাচার অ্যাক্সেস করতে এবং সামঞ্জস্যপূর্ণ ও কোঅর্ডিনেটেড উপায়ে নেভিগেশন ইভেন্ট দেখতে পারবে।

class MyComponent: NavigationEventDispatcherOwner {
    override val navigationEventDispatcher: NavigationEventDispatcher =
        NavigationEventDispatcher()
}

আপনি ComponentActivity-এর মধ্যে থাকলে, নিজের ডিসপ্যাচার প্রয়োগ করার পরিবর্তে, আপনার জন্য দেওয়া ডিসপ্যাচারটি রিট্রিভ করতে পারবেন।

class MyCustomActivity : ComponentActivity() {
    fun addMyHandler() {
        // navigationEventDispatcher provided by the ComponentActivity
        navigationEventDispatcher.addHandler(myNavigationEventHandler)
    }
}

একটি NavigationEventInput যোগ করুন

আপনি যেহেতু হ্যান্ডলার রেজিস্টার করেছেন, তাই ইভেন্ট পাওয়ার জন্য সেট-আপ সম্পূর্ণ হয়েছে। তবে, আপনাকে এমন একটি সোর্স প্রদান করতে হবে যেখান থেকে ইভেন্ট তৈরি করা হয় এবং NavigationEventInput।

NavigationEventInput হল প্ল্যাটফর্ম-নির্দিষ্ট কম্পোনেন্ট যা র সিস্টেম ইনপুট গ্রহণ করে এবং এটিকে একটি স্ট্যান্ডার্ড NavigationEvent-এ ট্রান্সলেট করে NavigationEventDispatcher-এ পাঠায়।

নিচে দেওয়া উদাহরণটি হল NavigationEventInput-এর কাস্টম প্রয়োগ:

public class MyInput : NavigationEventInput() {
    @MainThread
    public fun backStarted(event: NavigationEvent) {
        dispatchOnBackStarted(event)
    }

    @MainThread
    public fun backProgressed(event: NavigationEvent) {
        dispatchOnBackProgressed(event)
    }

    @MainThread
    public fun backCancelled() {
        dispatchOnBackCancelled()
    }

    @MainThread
    public fun backCompleted() {
        dispatchOnBackCompleted()
    }
}

এরপরে, আপনার ডিসপ্যাচারকে সেই ইনপুট দিন:

navigationEventDispatcher.addInput(MyInput())

dispose()-এর মাধ্যমে রিসোর্স ক্লিন-আপ করা

ডায়নামিক UI-তে মেমরি লিক আটকানোর জন্য, তৈরি করা প্রতিটি NavigationEventDispatcher ইনস্ট্যান্সকে, যে কম্পোনেন্টের সাথে এটি যুক্ত সেটি ধ্বংস হয়ে গেলে, dispose() মেথড ব্যবহার করে হায়ারার্কি থেকে স্পষ্টভাবে সরিয়ে দিতে হবে:

navigationEventDispatcher.dispose()

dispose() পদ্ধতিটি ক্রমশ মুছে ফেলার বিষয়টি নিশ্চিত করে, এর মাধ্যমে ডিসপ্যাচার ও তার সমস্ত বংশধরকে (সন্তান ও নাতি-নাতনি) পুনরাবৃত্তিমূলকভাবে সরিয়ে দেওয়া হয়। এর ফলে শেয়ার করা সিস্টেম থেকে সংশ্লিষ্ট সব হ্যান্ডলার আনরেজিস্টার করা হয়।

ডিসপ্যাচার হায়ারার্কি ও কন্ট্রোল

NavigationEventDispatcher-এ প্যারেন্ট-চাইল্ড হায়ারার্কি কাজ করে, এর ফলে UI-এর মধ্যে থাকা কম্পোনেন্ট (যেমন নেস্টেড NavHost বা ডায়ালগ) নেভিগেশন ইভেন্ট হ্যান্ডেলিংয়ে অংশ নিতে পারে।

চাইল্ড ডিসপ্যাচার তৈরি করা

কনস্ট্রাকশনের সময় এর পেরেন্ট ডিসপ্যাচার এর রেফারেন্স পাস করার মাধ্যমে চাইল্ড ডিসপ্যাচার তৈরি করা হয়। হায়ারার্কিতে থাকা সব ডিসপ্যাচার একই NavigationEventProcessor শেয়ার করে যাতে অগ্রাধিকারের ভিত্তিতে গ্লোবাল লাস্ট-ইন, ফার্স্ট-আউট (LIFO) ইভেন্ট অর্ডারিং বজায় রাখা যায়।

হায়ারার্কি অনুযায়ী চালু করা

ডিসপ্যাচার একটি isEnabled প্রপার্টি অন্তর্ভুক্ত করে যা ডেভেলপারদের হ্যান্ডলারের সম্পূর্ণ সাবট্রিকে একবারে চালু বা বন্ধ করতে দেয়।

কোনও পেরেন্ট ডিসপ্যাচার বন্ধ (isEnabled = false) করা হলে, সেই পেরেন্ট ও তার কোনও চাইল্ডের সাথে যুক্ত সব হ্যান্ডলারকে উপেক্ষা করা হবে, সেগুলির স্বতন্ত্র চালু থাকার স্ট্যাটাস যাই হোক না কেন।