برای پیادهسازی سیستم ناوبری قدرتمند، برنامه شما به روشی متمرکز برای
مدیریت کردن اشارههای برگشت و دیگر نشانهای ناوبری نیاز دارد. این صفحه نحوه استفاده از 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)، همه گردانندههای
مرتبط با آن والد و همه فرزندانش صرفنظر از وضعیت فعال بودنشان نادیده گرفته میشوند.