Я создал NavigationRail для своего новостного приложения, которое позволяет мне переходить к экрану поиска и домашнему экрану. У меня проблема с тем, что NavController, который я передал своему NavigationRail, не дает мне обновленную текущую позицию, из-за которой мои значки navigationRail не показывают, что они выбраны в пункте назначения.
Код для моей навигационной панели:
@Composable
fun NewsNavigationRail(
navController: NavHostController
){
val navigationItems = Destinations.values()
NavigationRail{
navigationItems.filter{
it.icon != null && it.label != null
}.forEach {
NavigationRailItem(
icon = { Icon(
it.icon!!,
contentDescription = it.name
) },
// problematic line --------------------------
selected = navController.currentDestination?.route == it.route,
onClick = {
},
label = { Text(it.label!!) }
)
}
}
}
И код для моего NavigationHost:
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun NavigationHost(){
val navController = rememberNavController()
Row {
NewsNavigationRail(
navController = navController
)
NavHost(navController = navController, startDestination = Destinations.HomeScreen.route){
composable(Destinations.HomeScreen.route){
val newsViewModel = hiltViewModel<NewsViewModel>()
HomeScreen(newsViewModel, navController)
}
composable(
"${Destinations.NewsScreen.route}/{url}",
arguments = listOf(navArgument("url"){
type = NavType.StringType
})
){
val url = it.arguments?.getString("url")
NewsScreen(url)
}
composable(Destinations.SearchScreen.route){
val newsViewModel = hiltViewModel<NewsViewModel>()
SearchScreen()
}
}
}
}
Да, я могу перемещаться между экранами.
Можете ли вы изменить unselectedContentColor и selectedContentColor в NavigationRail?
Я пробовал, но это не работает
Можете ли вы опубликовать класс Destination, я подозреваю, что у вас есть аргументы на экране новостей, которые могут повлиять на имя, вы пробовали без аргументов
И можете ли вы получить текущий маршрут с помощью этого кода; val navBackStackEntry с помощью navController.currentBackStackEntryAsState() val currentRoute = navBackStackEntry?.destination?.route
Да, это сработало. Большое спасибо, чувак, это беспокоило меня несколько дней !!
Отличная работа! можешь принять мой ответ. я добавляю в качестве ответа.
Попробуй это,
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
Вы можете перемещаться между экранами? Может быть, проблема в эффекте пульсации значка?