Типобезопасные маршруты навигации с аргументами

Я реализую навигацию в приложении 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)
}

Вышеупомянутый запечатанный класс работает хорошо, но не содержит аргументов маршрута. Есть ли чистый способ их добавить?

1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Аргументы маршрута в типобезопасной навигации предоставляются как свойства класса данных. Передача идентификатора пользователя на экран входа в систему будет выглядеть так:

@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().

Здесь вы можете найти подробное объяснение типобезопасной навигации.

Другие вопросы по теме