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

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