Menyiapkan dispatcher

Untuk menerapkan sistem navigasi yang andal, aplikasi Anda memerlukan cara terpusat untuk menangani gestur kembali dan sinyal navigasi lainnya. Halaman ini menjelaskan cara menggunakan NavigationEventDispatcher untuk mengoordinasikan dan mendistribusikan peristiwa navigasi ini di seluruh aplikasi Anda.

Mendeklarasikan NavigationEventDispatcher

NavigationEventDispatcher adalah komponen pusat library NavigationEvent. Class ini bertindak sebagai hub peristiwa yang mengirimkan peristiwa terkait navigasi, seperti gestur kembali dan transisi navigasi, ke pemroses terdaftar dalam aplikasi Anda. Komponen dapat berlangganan peristiwa ini untuk bereaksi terhadap perubahan navigasi atau tindakan navigasi yang didorong sistem lainnya.

Anda harus menyediakan instance NavigationEventDispatcher melalui NavigationEventDispatcherOwner. Hal ini memastikan bahwa berbagai bagian aplikasi Anda dapat mengakses dispatcher yang sama dan mengamati peristiwa navigasi secara konsisten dan terkoordinasi.

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

Jika Anda berada di dalam ComponentActivity, alih-alih menerapkan dispatcher Anda sendiri, Anda dapat mengambil dispatcher yang disediakan untuk Anda.

class MyCustomActivity : ComponentActivity() {
    fun addMyHandler() {
        // navigationEventDispatcher provided by the ComponentActivity
        navigationEventDispatcher.addHandler(myNavigationEventHandler)
    }
}

Tambahkan NavigationEventInput

Setelah mendaftarkan pengendali, Anda siap menerima peristiwa. Namun, Anda harus memberikan sumber tempat peristiwa dihasilkan dengan NavigationEventInput.

NavigationEventInput adalah komponen khusus platform yang menerima input sistem mentah dan menerjemahkannya ke NavigationEvent standar untuk dikirim ke NavigationEventDispatcher.

Contoh berikut adalah penerapan NavigationEventInput kustom:

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()
    }
}

Selanjutnya, berikan input tersebut ke dispatcher Anda:

navigationEventDispatcher.addInput(MyInput())

Membersihkan resource dengan dispose()

Untuk mencegah kebocoran memori di UI dinamis, setiap instance NavigationEventDispatcher yang dibuat harus dihapus secara eksplisit dari hierarki menggunakan metode dispose() saat komponen yang terkait dengannya dihancurkan:

navigationEventDispatcher.dispose()

Metode dispose() memastikan pembersihan bertingkat dengan menghapus pengirim dan semua turunannya (anak dan cucu) secara iteratif, serta menjamin bahwa semua handler terkait dibatalkan pendaftarannya dari sistem bersama.

Hierarki dan kontrol dispatcher

NavigationEventDispatcher mendukung hierarki induk-turunan, sehingga memungkinkan komponen yang bertingkat dalam UI (seperti NavHost atau dialog bertingkat) untuk berpartisipasi dalam penanganan peristiwa navigasi.

Membuat dispatcher turunan

Dispatcher turunan dibuat dengan meneruskan referensi ke dispatcher induknya selama konstruksi. Semua dispatcher dalam hierarki berbagi NavigationEventProcessor yang sama untuk mempertahankan pengurutan peristiwa Last-In, First-Out (LIFO) global berdasarkan prioritas.

Pengaktifan hierarkis

Dispatcher menyertakan properti isEnabled yang memungkinkan developer mengaktifkan atau menonaktifkan seluruh subtree handler sekaligus.

Jika dispatcher induk dinonaktifkan (isEnabled = false), semua handler yang terkait dengan induk tersebut dan turunannya akan diabaikan, terlepas dari status aktif masing-masing.