Kotlin DSL ve Navigation Compose'da güvenlik türü yazın

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.
    1. Örneğin: Profile::class

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. Yani composable<Profile>.
  • Hedef türünü tanımlamak, composable("profile") örneğinde olduğu gibi route dize 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 nedenle NavArgument gerekmez.
  • Profil rotası için toRoute() uzantı yöntemi, NavBackStackEntry ve bağımsız değişkenlerinden Profile nesnesini 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)
}

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.

Ek kaynaklar