একটি শক্তিশালী নেভিগেশন সিস্টেম বাস্তবায়নের জন্য, আপনার অ্যাপে ব্যাক জেসচার এবং অন্যান্য নেভিগেশন সিগন্যাল পরিচালনার জন্য একটি কেন্দ্রীভূত পদ্ধতির প্রয়োজন। এই পৃষ্ঠায় বর্ণনা করা হয়েছে কীভাবে আপনার অ্যাপ্লিকেশন জুড়ে এই নেভিগেশন ইভেন্টগুলোকে সমন্বয় ও বিতরণ করতে NavigationEventDispatcher ব্যবহার করা যায়।
একটি NavigationEventDispatcher ঘোষণা করুন
NavigationEventDispatcher হলো NavigationEvent লাইব্রেরির কেন্দ্রীয় উপাদান। এটি একটি ইভেন্ট হাব হিসেবে কাজ করে যা আপনার অ্যাপের মধ্যে নিবন্ধিত লিসেনারদের কাছে নেভিগেশন-সম্পর্কিত ইভেন্ট, যেমন ব্যাক জেসচার এবং নেভিগেশন ট্রানজিশন, প্রেরণ করে। কম্পোনেন্টগুলো নেভিগেশন পরিবর্তন বা অন্যান্য সিস্টেম-চালিত নেভিগেশন অ্যাকশনের প্রতিক্রিয়া জানাতে এই ইভেন্টগুলোতে সাবস্ক্রাইব করতে পারে।
আপনার 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 বা ডায়ালগ) নেভিগেশন ইভেন্ট হ্যান্ডলিং-এ অংশগ্রহণ করতে সক্ষম করে।
একটি চাইল্ড ডিসপ্যাচার তৈরি করুন
কনস্ট্রাকশনের সময় প্যারেন্ট ডিসপ্যাচারের একটি রেফারেন্স পাস করার মাধ্যমে একটি চাইল্ড ডিসপ্যাচার তৈরি করা হয়। প্রায়োরিটির উপর ভিত্তি করে একটি গ্লোবাল লাস্ট-ইন, ফার্স্ট-আউট (LIFO) ইভেন্ট অর্ডারিং বজায় রাখার জন্য, একটি হায়ারার্কির সমস্ত ডিসপ্যাচার একই NavigationEventProcessor শেয়ার করে।
শ্রেণিবদ্ধ সক্ষমকরণ
ডিসপ্যাচারে একটি isEnabled প্রপার্টি রয়েছে যা ডেভেলপারদেরকে হ্যান্ডলারের একটি সম্পূর্ণ সাবট্রি একবারে চালু বা বন্ধ করার সুযোগ দেয়।
যখন কোনো প্যারেন্ট ডিসপ্যাচার নিষ্ক্রিয় থাকে ( isEnabled = false ), তখন সেই প্যারেন্ট এবং তার যেকোনো চাইল্ডের সাথে যুক্ত সমস্ত হ্যান্ডলার উপেক্ষা করা হবে, তাদের স্বতন্ত্র সক্রিয় অবস্থা নির্বিশেষে।