برای پیادهسازی یک سیستم ناوبری قوی، برنامه شما به یک روش متمرکز برای مدیریت اشارههای برگشت و سایر سیگنالهای ناوبری نیاز دارد. این صفحه نحوه استفاده از NavigationEventDispatcher را برای هماهنگ کردن و توزیع این رویدادهای پیمایش در سراسر برنامه شرح میدهد.
اعلام NavigationEventDispatcher
NavigationEventDispatcher مؤلفه اصلی کتابخانه
NavigationEvent است. این میانای برنامهسازی کاربردی بهعنوان یک مرکز رویداد عمل میکند که رویدادهای مرتبط با پیمایش، مانند اشارههای بازگشت و انتقالهای پیمایش، را به شنوندگان ثبتشده در برنامه شما ارسال میکند. مؤلفهها میتوانند در این رویدادها مشترک شوند تا به تغییرات پیمایش یا سایر کنشهای پیمایش مبتنی بر سیستم واکنش نشان دهند.
باید NavigationEventDispatcher نمونه را ازطریق
NavigationEventDispatcherOwner ارائه دهید. این کار تضمین میکند که بخشهای مختلف برنامهتان بتوانند به یک توزیعکننده دسترسی داشته باشند و رویدادهای پیمایش را بهصورت هماهنگ و منسجم مشاهده کنند.
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()
برای جلوگیری از نشت حافظه در واسط کاربر پویا، هر نمونه
NavigationEventDispatcher ایجادشده باید صریحاً بااستفاده از روش dispose() از سلسلهمراتب برداشته شود
وقتی مؤلفهای که به آن گره خورده است
ازبین میرود:
navigationEventDispatcher.dispose()
روش dispose() با حذف مکرر توزیعکننده و همه فرزندان و نوههای آن، پاکسازی آبشاری را تضمین میکند و تضمین میکند که همه گردانندههای مرتبط از سیستم مشترک لغو ثبتنام میشوند.
سلسلهمراتب و کنترل اعزامکننده
NavigationEventDispatcher از سلسلهمراتب والد-فرزند پشتیبانی میکند و به مؤلفههایی که در عمق واسط کاربر تودرتو شدهاند (مانند NavHostهای تودرتو یا کادرهای گفتگو) امکان میدهد در مدیریت رویداد پیمایش شرکت کنند.
ایجاد توزیعکننده فرزند
توزیعکننده فرزند با ارسال ارجاعی به توزیعکننده والد خود
درطول ساخت ایجاد میشود. همه توزیعکنندهها در یک سلسلهمراتب،
NavigationEventProcessor یکسانی را برای حفظ ترتیب رویدادهای سراسری آخرین ورودی، اولین خروجی (LIFO)
براساس اولویت همرسانی میکنند.
فعالسازی سلسلهمراتبی
توزیعکننده شامل ویژگی isEnabled است که به توسعهدهندگان اجازه میدهد
کل زیردرخت گردانندهها را بهطور همزمان فعال یا غیرفعال کنند.
وقتی توزیعکننده اصلی غیرفعال باشد (isEnabled = false)، همه گردانندههای مرتبط با آن توزیعکننده اصلی و هریک از توزیعکنندههای فرعی آن، صرفنظر از وضعیت فعال بودن فردی آنها، نادیده گرفته خواهند شد.