Keamanan jenis di Kotlin DSL dan Navigation Compose

Anda dapat menggunakan API bawaan yang aman untuk jenis guna memberikan keamanan jenis waktu kompilasi untuk grafik navigasi Anda. API ini tersedia saat aplikasi Anda menggunakan Navigation Compose atau Navigation Kotlin DSL. Fitur ini tersedia mulai Navigation 2.8.0.

API ini setara dengan yang disediakan Safe Args untuk grafik navigasi yang dibuat menggunakan XML.

Menentukan rute

Untuk menggunakan rute yang aman untuk jenis di Compose, Anda harus menentukan class atau objek yang dapat diserialisasi yang merepresentasikan rute Anda terlebih dahulu.

Untuk menentukan objek yang dapat diserialisasi, gunakan anotasi @Serializable yang disediakan oleh plugin Serialisasi Kotlin. Plugin ini dapat ditambahkan ke project Anda dengan menambahkan dependensi ini.

Gunakan aturan berikut untuk memutuskan jenis yang akan digunakan untuk rute Anda:

  • Objek: Gunakan objek untuk rute tanpa argumen.
  • Class: Gunakan class atau class data untuk rute dengan argumen.
  • KClass<T>: Gunakan jika Anda tidak perlu meneruskan argumen, seperti class tanpa parameter, atau class yang semua parameternya memiliki nilai default
    1. Contoh: Profile::class

Dalam semua kasus, objek atau class harus dapat diserialisasi.

Contoh:

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

Buat grafik Anda

Selanjutnya, Anda perlu menentukan grafik navigasi. Gunakan fungsi composable() untuk menentukan composable sebagai tujuan dalam grafik navigasi Anda.

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

Perhatikan hal-hal berikut dalam contoh ini:

  • composable() menggunakan parameter jenis. Artinya, composable<Profile>.
  • Menentukan jenis tujuan adalah pendekatan yang lebih andal daripada meneruskan route string seperti pada composable("profile").
  • Class rute menentukan jenis setiap argumen navigasi, seperti pada val id: String, sehingga tidak memerlukan NavArgument.
  • Untuk rute profil, metode ekstensi toRoute() membuat ulang objek Profile dari NavBackStackEntry dan argumennya.

Untuk informasi selengkapnya tentang cara mendesain grafik secara umum, lihat halaman Mendesain grafik Navigasi.

Mengakses argumen di ViewModel

Untuk mengakses argumen dari rute yang aman untuk jenis di ViewModel, Anda dapat mengambil rute dari SavedStateHandle dengan memanggil SavedStateHandle.toRoute<T>(), dengan T adalah class rute Anda:

class ProfileViewModel(
    savedStateHandle: SavedStateHandle
) : ViewModel() {
    private val profile = savedStateHandle.toRoute<Profile>()
    private val userInfo: Flow<UserInfo> = userInfoRepository.getUserInfo(profile.id)
}

Terakhir, Anda dapat membuka composable menggunakan fungsi navigate() dengan meneruskan instance rute:

navController.navigate(Profile(id = 123))

Tindakan ini mengarahkan pengguna ke tujuan composable<Profile> dalam grafik navigasi. Argumen navigasi apa pun, seperti id, dapat diperoleh dengan merekonstruksi Profile menggunakan NavBackStackEntry.toRoute dan membaca propertinya.

Referensi lainnya