یک توزیع‌کننده راه‌اندازی کنید

برای پیاده‌سازی یک سیستم ناوبری قوی، برنامه شما به یک روش متمرکز برای مدیریت حرکات برگشت و سایر سیگنال‌های ناوبری نیاز دارد. این صفحه نحوه استفاده NavigationEventDispatcher را برای هماهنگی و توزیع این رویدادهای ناوبری در سراسر برنامه شما شرح می‌دهد.

یک NavigationEventDispatcher تعریف کنید

NavigationEventDispatcher کامپوننت مرکزی کتابخانه NavigationEvent است. این کامپوننت به عنوان یک مرکز رویداد عمل می‌کند که رویدادهای مرتبط با ناوبری، مانند حرکات برگشت و انتقال ناوبری، را به شنوندگان ثبت‌شده در برنامه شما ارسال می‌کند. کامپوننت‌ها می‌توانند در این رویدادها مشترک شوند تا به تغییرات ناوبری یا سایر اقدامات ناوبری مبتنی بر سیستم واکنش نشان دهند.

شما باید نمونه‌های NavigationEventDispatcher از طریق NavigationEventDispatcherOwner ارائه دهید. این تضمین می‌کند که بخش‌های مختلف برنامه شما می‌توانند به یک dispatcher دسترسی داشته باشند و رویدادهای ناوبری را به روشی سازگار و هماهنگ مشاهده کنند.

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

اگر درون یک ComponentActivity هستید، به جای پیاده‌سازی dispatcher خودتان، می‌توانید dispatcher ارائه شده برای خودتان را بازیابی کنید.

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() با حذف تکراری dispatcher و تمام فرزندان آن (فرزندان و نوه‌ها) یک پاکسازی آبشاری را تضمین می‌کند و تضمین می‌کند که تمام handlerهای مرتبط از سیستم مشترک ثبت نشده‌اند.

سلسله مراتب و کنترل توزیع کننده

NavigationEventDispatcher از سلسله مراتب والد-فرزندی پشتیبانی می‌کند و به کامپوننت‌های تودرتو در عمق یک رابط کاربری (مانند NavHost ها یا دیالوگ‌های تودرتو) اجازه می‌دهد تا در مدیریت رویدادهای ناوبری شرکت کنند.

یک توزیع‌کننده کودک ایجاد کنید

یک توزیع‌کننده فرزند با ارسال یک ارجاع به توزیع‌کننده والد خود در حین ساخت ایجاد می‌شود. همه توزیع‌کننده‌های موجود در یک سلسله مراتب NavigationEventProcessor یکسانی را به اشتراک می‌گذارند تا ترتیب رویداد سراسری Last-In, First-Out (LIFO) را بر اساس اولویت حفظ کنند.

فعال‌سازی سلسله مراتبی

این dispatcher شامل یک ویژگی isEnabled است که به توسعه‌دهندگان اجازه می‌دهد کل یک زیردرخت از handlerها را به طور همزمان فعال یا غیرفعال کنند.

وقتی یک توزیع‌کننده‌ی والد غیرفعال باشد ( isEnabled = false )، تمام هندلرهای مرتبط با آن والد و هر یک از فرزندانش، صرف نظر از وضعیت فعال بودن هر یک از آنها، نادیده گرفته می‌شوند.