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.