Derleme zamanında gezinme grafiğiniz için tür güvenliği sağlamak üzere yerleşik tür güvenli API'leri kullanabilirsiniz. Bu API'ler, uygulamanız Navigation Compose veya Navigation Kotlin DSL'yi kullandığında kullanılabilir. Bu özellikler Navigation
2.8.0 itibarıyla kullanılabilir.
Bu API'ler, XML kullanılarak oluşturulan gezinme grafiklerine Safe Args'ın sağladığı işlevlere eşdeğerdir.
Rotaları tanımlama
Compose'da tür güvenli rotaları kullanmak için öncelikle rotalarınızı temsil eden, serileştirilebilir sınıflar veya nesneler tanımlamanız gerekir.
Serileştirilebilir nesneleri tanımlamak için Kotlin Serialization eklentisi tarafından sağlanan @Serializable ek açıklamasını kullanın.
Bu eklenti, bu bağımlılıklar eklenerek projenize eklenebilir.
Rotanız için hangi türü kullanacağınıza karar vermek üzere aşağıdaki kurallardan yararlanın:
- Object: Bağımsız değişken içermeyen rotalar için bir nesne kullanın.
- Sınıf: Bağımsız değişken içeren rotalar için sınıf veya veri sınıfı kullanın.
KClass<T>: Bağımsız değişkenleri (ör. parametre içermeyen bir sınıf veya tüm parametrelerin varsayılan değerlere sahip olduğu bir sınıf) iletmeniz gerekmiyorsa kullanın.- Örneğin:
Profile::class
- Örneğin:
Her durumda nesne veya sınıf serileştirilebilir olmalıdır.
Örneğin:
// 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)
Grafiğinizi oluşturma
Ardından, gezinme grafiğinizi tanımlamanız gerekir. Composable'ları gezinme grafiğinizde hedef olarak tanımlamak için composable() işlevini kullanın.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
Bu örnekte aşağıdakilere dikkat edin:
composable(), tür parametresi alır. Yanicomposable<Profile>.- Hedef türünü tanımlamak,
composable("profile")örneğinde olduğu gibiroutedize iletmeye kıyasla daha sağlam bir yaklaşımdır. - Rota sınıfı, her gezinme bağımsız değişkeninin türünü
val id: Stringörneğinde olduğu gibi tanımlar. Bu nedenleNavArgumentgerekmez. - Profil rotası için
toRoute()uzantı yöntemi,NavBackStackEntryve bağımsız değişkenlerindenProfilenesnesini yeniden oluşturur.
Grafiğinizi genel olarak nasıl tasarlayacağınız hakkında daha fazla bilgi için Gezinme grafiğinizi tasarlama sayfasına bakın.
ViewModel'de bağımsız değişkenlere erişme
ViewModel içinde tür güvenli bir rotadan bağımsız değişkenlere erişmek için SavedStateHandle rotasını SavedStateHandle.toRoute<T>() çağırarak alabilirsiniz. Burada T, rota sınıfınızdır:
class ProfileViewModel(
savedStateHandle: SavedStateHandle
) : ViewModel() {
private val profile = savedStateHandle.toRoute<Profile>()
private val userInfo: Flow<UserInfo> = userInfoRepository.getUserInfo(profile.id)
}
Güvenli rota türüne gidin
Son olarak, rotanın örneğini ileterek navigate() işlevini kullanarak composable'ınıza gidebilirsiniz:
navController.navigate(Profile(id = 123))
Bu işlem, kullanıcıyı gezinme grafiğindeki composable<Profile> hedefe yönlendirir. id gibi tüm gezinme bağımsız değişkenleri, NavBackStackEntry.toRoute kullanılarak Profile yeniden oluşturulup özellikleri okunarak elde edilebilir.