Я реализую навигацию в приложении Compose, используя руководства:
Итак, вместо использования строковых маршрутов я использую объекты, как предложено. Однако я немного не понимаю, как добавлять экраны навигации с аргументами маршрута. Я знаю, что это скорее вопрос Kotlin, чем Android/Compose.
Я написал это:
@Serializable
sealed class NavigationScreen (
@StringRes val nameResourceId: Int,
@DrawableRes val iconResourceId: Int
) {
@Serializable
data object SignIn: NavigationScreen( R.string.sign_in, R.drawable.baseline_person_24)
@Serializable
data object Home: NavigationScreen( R.string.home, R.drawable.baseline_home_24)
@Serializable
data object Settings: NavigationScreen(R.string.settings, R.drawable.baseline_settings_24)
}
Вышеупомянутый запечатанный класс работает хорошо, но не содержит аргументов маршрута. Есть ли чистый способ их добавить?
Аргументы маршрута в типобезопасной навигации предоставляются как свойства класса данных. Передача идентификатора пользователя на экран входа в систему будет выглядеть так:
@Serializable
data class SignIn(val userId: Int): NavigationScreen( R.string.sign_in, R.drawable.baseline_person_24)
В вашем NavHost вам больше не нужно указывать строку маршрута, все, что вам нужно указать, это тип навигации, например. Войти:
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToSignIn = { userId ->
navController.navigate(SignIn(userId))
})
}
composable<SignIn> { backStackEntry ->
val signIn: SignIn = backStackEntry.toRoute()
SignInScreen(signIn)
}
}
Теперь вы можете использовать метод расширения NavBackStackEntry.toRoute()
для создания типа навигации. Доступ к этому типу также можно получить в ViewModels через SavedStateHandle.toRoute()
.
Здесь вы можете найти подробное объяснение типобезопасной навигации.