Ringkasan Bab 24. Navigasi halaman
Catatan
Buku ini diterbitkan pada musim semi 2016, dan belum diperbarui sejak saat itu. Ada banyak dalam buku yang tetap berharga, tetapi beberapa materi sudah kedaluarsa, dan beberapa topik tidak lagi sepenuhnya benar atau lengkap.
Banyak aplikasi terdiri dari beberapa halaman di antaranya pengguna menavigasi. Aplikasi selalu memiliki halaman utama atau halaman beranda , dan dari sana pengguna menavigasi ke halaman lain, yang dipertahankan dalam tumpukan untuk menavigasi kembali. Opsi navigasi tambahan tercakup dalam Bab 25. Varietas Halaman.
Halaman modal dan halaman tanpa mode
VisualElement
Navigation
menentukan properti jenis INavigation
, yang mencakup dua metode berikut untuk menavigasi ke halaman baru:
Kedua metode menerima Page
instans sebagai argumen dan mengembalikan Task
objek. Dua metode berikut menavigasi kembali ke halaman sebelumnya:
Jika antarmuka pengguna memiliki tombol Kembali sendiri (seperti yang dilakukan ponsel Android dan Windows) maka aplikasi tidak perlu memanggil metode ini.
Meskipun metode ini tersedia dari apa pun VisualElement
, umumnya metode ini Navigation
dipanggil dari properti instans saat ini Page
.
Aplikasi umumnya menggunakan halaman modal ketika pengguna diharuskan untuk memberikan beberapa informasi di halaman sebelum kembali ke halaman sebelumnya. Halaman yang tidak dimodifikasi terkadang disebut modeless atau hierarkis. Tidak ada di halaman itu sendiri yang membedakannya sebagai modal atau modeless; diatur sebagai gantinya oleh metode yang digunakan untuk menavigasi ke metode tersebut. Untuk bekerja di semua platform, halaman modal harus menyediakan antarmuka penggunanya sendiri untuk menavigasi kembali ke halaman sebelumnya.
Sampel ModelessAndModal memungkinkan Anda menjelajahi perbedaan antara halaman modeless dan modal. Aplikasi apa pun yang menggunakan navigasi halaman harus meneruskan halaman berandanya ke NavigationPage
konstruktor, umumnya di kelas program App
. Salah satu bonus adalah Anda tidak perlu lagi mengatur Padding
di halaman untuk iOS.
Anda akan menemukan bahwa untuk halaman tanpa mode, properti halaman Title
ditampilkan. Platform iOS, Android, dan tablet dan desktop Windows semuanya menyediakan elemen antarmuka pengguna untuk menavigasi kembali ke halaman sebelumnya. Tentu saja, perangkat Ponsel Android, dan Windows memiliki tombol Kembali standar untuk kembali.
Untuk halaman modal, halaman Title
tidak ditampilkan, dan tidak ada elemen antarmuka pengguna yang disediakan untuk kembali ke halaman sebelumnya. Meskipun Anda dapat menggunakan tombol Kembali standar ponsel Android dan Windows untuk kembali ke halaman sebelumnya, halaman modal di platform lain harus menyediakan mekanismenya sendiri untuk kembali.
Transisi halaman animasi
Versi alternatif dari berbagai metode navigasi disediakan dengan argumen Boolean kedua yang Anda atur true
jika Anda ingin transisi halaman menyertakan animasi:
Namun, metode navigasi halaman standar mencakup animasi secara default, jadi ini hanya berharga untuk menavigasi ke halaman tertentu pada startup (seperti yang dibahas menjelang akhir bab ini) atau saat menyediakan animasi masuk Anda sendiri (seperti yang dibahas dalam Bab22. Animasi).
Variasi visual dan fungsi
NavigationPage
menyertakan dua properti yang dapat Anda tetapkan saat membuat instans kelas dalam metode Anda App
:
NavigationPage
juga mencakup empat properti yang dapat diikat terlampir yang memengaruhi halaman tertentu tempat properti tersebut diatur:
SetHasBackButton
danGetHasBackButton
SetHasNavigationBar
danGetHasNavigationBar
SetBackButtonTitle
danGetBackButtonTitle
bekerja di iOS sajaSetTitleIcon
danGetTitleIcon
hanya bekerja di iOS dan Android
Menjelajahi mekanika
Metode navigasi halaman semuanya asinkron dan harus digunakan dengan await
. Penyelesaian tidak menunjukkan bahwa navigasi halaman telah selesai, tetapi hanya aman untuk memeriksa tumpukan navigasi halaman.
Ketika satu halaman menavigasi ke halaman lain, halaman pertama umumnya mendapatkan panggilan ke metodenya OnDisappearing
, dan halaman kedua mendapatkan panggilan ke metodenya OnAppearing
. Demikian pula, ketika satu halaman kembali ke halaman lain, halaman pertama mendapatkan panggilan ke metodenya, dan halaman kedua umumnya OnDisappearing
mendapatkan panggilan ke metodenya OnAppearing
. Urutan panggilan ini (dan penyelesaian metode asinkron yang memanggil navigasi) tergantung pada platform. Penggunaan kata "umumnya" dalam dua pernyataan sebelumnya disebabkan oleh navigasi halaman modal Android, di mana panggilan metode ini tidak terjadi.
Selain itu, panggilan ke OnAppearing
metode dan OnDisappearing
tidak selalu menunjukkan navigasi halaman.
Antarmuka INavigation
mencakup dua properti koleksi yang memungkinkan Anda memeriksa tumpukan navigasi:
NavigationStack
tipeIReadOnlyList<Page>
untuk tumpukan tanpa modeModalStack
tipeIReadOnlyList<Page>
untuk tumpukan modal
Paling aman untuk mengakses tumpukan ini dari Navigation
properti NavigationPage
(yang seharusnya menjadi App
properti kelas MainPage
). Hanya aman untuk memeriksa tumpukan ini setelah metode navigasi halaman asinkron selesai. Properti CurrentPage
NavigationPage
tidak menunjukkan halaman saat ini jika halaman saat ini adalah halaman modal, tetapi menunjukkan sebagai gantinya halaman tanpa mode terakhir.
Sampel SinglePageNavigation memungkinkan Anda menjelajahi navigasi halaman dan tumpukan, dan jenis legal navigasi halaman:
- Halaman tanpa mode dapat menavigasi ke halaman tanpa mode lain atau halaman modal
- Halaman modal hanya dapat menavigasi ke halaman modal lain
Memberlakukan modalitas
Aplikasi menggunakan halaman modal saat diperlukan untuk mendapatkan beberapa informasi dari pengguna. Pengguna harus dilarang kembali ke halaman sebelumnya hingga informasi tersebut diberikan. Di iOS, mudah untuk menyediakan tombol Kembali dan mengaktifkannya hanya ketika pengguna telah selesai dengan halaman. Tetapi untuk perangkat ponsel Android dan Windows, aplikasi harus mengambil OnBackButtonPressed
alih metode dan mengembalikan true
jika program telah menangani tombol Kembali itu sendiri, seperti yang ditunjukkan dalam sampel ModalEnforcement.
Sampel MvvmEnforcement menunjukkan cara kerjanya dalam skenario MVVM.
Variasi navigasi
Jika halaman modal tertentu dapat dinavigasi beberapa kali, halaman tersebut harus menyimpan informasi sehingga pengguna dapat mengedit informasi daripada mengetik semuanya lagi. Anda dapat menangani ini dengan mempertahankan instans tertentu dari halaman modal, tetapi pendekatan yang lebih baik (terutama di iOS) mempertahankan informasi dalam model tampilan.
Membuat menu navigasi
Sampel ViewGalleryType menunjukkan menggunakan TableView
item menu untuk mencantumkan. Setiap item dikaitkan dengan Type
objek untuk halaman tertentu. Ketika item tersebut dipilih, program membuat instans halaman dan menavigasi ke item tersebut.
Sampel ViewGalleryInst sedikit berbeda karena menu berisi instans setiap halaman daripada jenis. Ini membantu menyimpan informasi dari setiap halaman, tetapi semua halaman harus dibuat saat startup program.
Memanipulasi tumpukan navigasi
StackManipulation menunjukkan beberapa fungsi yang ditentukan oleh INavigation
yang memungkinkan Anda memanipulasi tumpukan navigasi secara terstruktur:
RemovePage
InsertPageBefore
PopToRootAsync
danPopToRootAsync
dengan animasi opsional
Pembuatan halaman dinamis
Sampel BuildAPage menunjukkan pembuatan halaman saat runtime berdasarkan input pengguna.
Pola transfer data
Seringkali perlu berbagi data antar halaman — untuk mentransfer data ke halaman yang dinavigasi, dan agar halaman mengembalikan data ke halaman yang memanggilnya. Ada beberapa teknik untuk melakukan ini.
Argumen konstruktor
Saat menavigasi ke halaman baru, dimungkinkan untuk membuat instans kelas halaman dengan argumen konstruktor yang memungkinkan halaman menginisialisasi dirinya sendiri. Sampel SchoolAndStudents menunjukkan hal ini. Halaman yang dinavigasi juga dapat diatur oleh halaman yang menavigasi BindingContext
ke halaman tersebut.
Properti dan panggilan metode
Contoh transfer data yang tersisa menjelajahi masalah meneruskan informasi antar halaman saat satu halaman menavigasi ke halaman lain dan kembali. Dalam diskusi ini, halaman beranda menavigasi ke halaman info, dan harus mentransfer informasi yang diinisialisasi ke halaman info. Halaman info mendapatkan informasi tambahan dari pengguna dan mentransfer informasi ke halaman beranda .
Beranda dapat dengan mudah mengakses metode dan properti publik di halaman info segera setelah membuat instans halaman tersebut. Halaman info juga dapat mengakses metode dan properti publik di beranda , tetapi memilih waktu yang tepat untuk ini bisa sulit. Sampel DateTransfer1 melakukan ini dalam penimpaannya OnDisappearing
. Salah satu kelemahannya adalah bahwa halaman info perlu mengetahui jenis halaman beranda .
MessagingCenter
Kelas ini Xamarin.FormsMessagingCenter
menyediakan cara lain bagi dua halaman untuk berkomunikasi satu sama lain. Pesan diidentifikasi oleh string teks dan dapat disertai dengan objek apa pun.
Program yang ingin menerima pesan dari jenis tertentu harus berlangganannya menggunakan MessagingCenter.Subscribe
dan menentukan fungsi panggilan balik. Nantinya dapat berhenti berlangganan dengan memanggil MessagingCenter.Unsubscribe
. Fungsi panggilan balik menerima pesan apa pun yang dikirim dari jenis yang ditentukan dengan nama yang ditentukan yang dikirim melalui Send
metode .
Program DateTransfer2 menunjukkan cara mentransfer data menggunakan pusat olahpesan, tetapi sekali lagi ini mengharuskan halaman info mengetahui jenis halaman beranda .
Acara
Acara ini adalah pendekatan yang dihormati waktu bagi satu kelas untuk mengirim informasi ke kelas lain tanpa mengetahui jenis kelas tersebut. Dalam sampel DateTransfer3, kelas info menentukan peristiwa yang diaktifkannya saat informasi siap. Namun, tidak ada tempat yang nyaman bagi halaman beranda untuk melepaskan penanganan aktivitas.
Perantara kelas Aplikasi
Sampel DateTransfer4 memperlihatkan cara mengakses properti yang App
ditentukan di kelas oleh halaman beranda dan halaman info . Ini adalah solusi yang baik, tetapi bagian berikutnya menjelaskan sesuatu yang lebih baik.
Beralih ke ViewModel
Menggunakan ViewModel untuk informasi memungkinkan halaman beranda dan halaman info untuk berbagi instans kelas informasi. Ini ditunjukkan dalam sampel DateTransfer5.
Menyimpan dan memulihkan status halaman
Perantara App
kelas atau pendekatan ViewModel sangat ideal ketika aplikasi harus menyimpan informasi jika program tidur saat halaman info aktif. Sampel DateTransfer6 menunjukkan ini.
Menyimpan dan memulihkan tumpukan navigasi
Dalam kasus umum, program perkalian yang tidur harus menavigasi ke halaman yang sama ketika dipulihkan. Ini berarti bahwa program seperti itu harus menyimpan isi tumpukan navigasi. Bagian ini menunjukkan cara mengotomatiskan proses ini di kelas yang dirancang untuk tujuan ini. Kelas ini juga memanggil halaman individual untuk memungkinkan mereka menyimpan dan memulihkan status halaman mereka.
Pustaka Xamarin.FormsBook.Toolkit mendefinisikan antarmuka bernama IPersistantPage
yang dapat diterapkan kelas untuk menyimpan dan memulihkan item dalam Properties
kamus.
Kelas MultiPageRestorableApp
di Xamarin.Formspustaka Book.Toolkit berasal dari Application
. Anda kemudian dapat memperoleh kelas Anda App
dari MultiPageRestorableApp
dan melakukan beberapa housekeeping.
StackRestoreDemo menunjukkan penggunaan MultiPageRestorableApp
.
Sesuatu seperti aplikasi kehidupan nyata
Sampel NoteTaker juga memanfaatkan MultiPageRestorableApp
dan memungkinkan memasukkan dan mengedit catatan yang disimpan dalam Properties
kamus.