Как заставить нижнюю навигацию работать вместе с навигацией между экранами в Jetpack Compose?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как заставить нижнюю навигацию работать вместе с навигацией между экранами в Jetpack Compose?

Сообщение Anonymous »


Я реализовал нижнюю панель с переходом к четырем различным экранам: «Домашняя страница», «Избранное», «Прослушанное» и «О программе». Я также реализовал навигацию отдельно от нижней панели, где вы можете перейти от «HomePage» к «MorePage». Ниже приведен эскиз навигации:

введите здесь описание изображения

Когда вы открываете приложение, работает нижняя панель навигации; Я могу нормально перемещаться между экранами панели навигации; но когда я пытаюсь перейти к «MoreScreen», приложение вылетает. Я получаю следующую ошибку:

java.lang.IllegalArgumentException: пункт назначения навигации, соответствующий запросу NavDeepLinkRequest{ uri=android-app://androidx.navigation/more_screen2130968599/0739 - Ready for the House/1978/Album/43:14/https: __www.youtube.com_watch?v=eAYs3sDcbbM/https:__corwoodindustries.com_product_0739_/false/ГОЛЫЕ ДНЕМ.... невозможно найти в графе навигации ComposeNavGraph(0x0) startDestination={Destination(0x442b361f) Route=home_screen} Ниже приведен мой файл Navigation.kt:

/** * Навигационный график */ пакет com.example.jandeksdiscography.navigation импортировать androidx.compose.animation.EnterTransition импортировать androidx.compose.animation.ExitTransition импортировать androidx.compose.runtime.Composable импортировать androidx.compose.ui.Modifier импортировать androidx.navigation.NavHostController импортировать androidx.navigation.NavType импортировать androidx.navigation.compose.NavHost импортировать androidx.navigation.compose.composable импортировать androidx.navigation.navArgument импортировать com.example.jandeksdiscography.screens.FavoritePage импортировать com.example.jandeksdiscography.screens.InfoColumn импортировать com.example.jandeksdiscography.screens.JandekApp импортировать com.example.jandeksdiscography.screens.LyricsColumn @Композитный забавная настройкаNavGraph( навконтроллер: Навхостконтроллер ) { NavHost( navController = navController, startDestination = Screen.HomePage.route, EnterTransition = { EnterTransition.None}, выходTransition = {ExitTransition.None}, ) { составной( маршрут = Screen.HomePage.route ) { JandekApp(navController = navController) } составной( маршрут = Screen.MoreScreen.route, аргументы = списокOf( navArgument(COVER) { тип = NavType.IntType }, navArgument(ИМЯ) { тип = NavType.StringType }, navArgument(ГОД) { тип = NavType.StringType }, navArgument(ТИП) { тип = NavType.StringType }, navArgument(ДЛИТЕЛЬНОСТЬ) { тип = NavType.StringType }, navArgument(LISTEN_LINK) { тип = NavType.StringType }, navArgument(BUY_LINK) { тип = NavType.StringType }, navArgument(IS_FAVORITE) { тип = NavType.BoolType }, navArgument(ЛИРИКА) { тип = NavType.StringType }) ) { запись -> Информационный столбец( navController = navController, обложка = запись.аргументы?.getInt(COVER), имя = запись.аргументы?.getString(ИМЯ), год = запись.аргументы?.getString(ГОД), тип = запись.аргументы?.getString(ТИП), длительность = запись.аргументы?.getString(ДЛИТЕЛЬНОСТЬ), прослушиваниеLink = запись.аргументы?.getString(LISTEN_LINK), buyLink = вход.аргументы?.getString(BUY_LINK), тексты песен = вход.аргументы?.getString(LYRICS), ) } составной( маршрут = Screen.LyricsPage.route, аргументы = списокOf( navArgument(ИМЯ) { тип = NavType.StringType }, navArgument(ЛИРИКА) { тип = NavType.StringType } ) ) {запись -> Колонка текста( navController = navController, имя = запись.аргументы?.getString(ИМЯ), тексты песен = вход.аргументы?.getString(LYRICS), модификатор = Модификатор ) } } } Вот мой файл BottomNavigationGraph.kt:

@file:OptIn(ExperimentalMaterial3Api::class) пакет com.example.jandeksdiscography.navigation импортировать android.os.Build импортировать androidx.annotation.RequiresApi импортировать androidx.compose.animation.EnterTransition импортировать androidx.compose.animation.ExitTransition импортировать androidx.compose.foundation.layout.fillMaxSize импортировать androidx.compose.foundation.layout.padding импортировать androidx.compose.material.icons.Icons импортировать androidx.compose.material.icons.filled.CheckCircle импортировать androidx.compose.material.icons.filled.Избранное импортировать androidx.compose.material.icons.filled.Home импортировать androidx.compose.material.icons.filled.Info импортировать androidx.compose.material.icons.outlined.CheckCircle импортировать androidx.compose.material.icons.outlined.FavoriteBorder импортировать androidx.compose.material.icons.outlined.Home импортировать androidx.compose.material.icons.outlined.Info импортировать androidx.compose.material3.ExperimentalMaterial3Api импортировать androidx.compose.material3.Icon импортировать androidx.compose.material3.MaterialTheme импортировать androidx.compose.material3.NavigationBar импортировать androidx.compose.material3.NavigationBarItem импортировать androidx.compose.material3.Scaffold импортировать androidx.compose.material3.Surface импортировать androidx.compose.material3.Text импортировать androidx.compose.runtime.Composable импортировать androidx.compose.runtime.getValue импортировать androidx.compose.runtime.mutableStateOf импортировать androidx.compose.runtime.saveable.rememberSaveable импортировать androidx.compose.runtime.setValue импортировать androidx.compose.ui.Modifier импортировать androidx.navigation.NavGraph.Companion.findStartDestination импортировать androidx.navigation.compose.NavHost импортировать androidx.navigation.compose.composable импортировать androidx.navigation.compose.rememberNavController импортировать com.example.jandeksdiscography.screens.AboutPage импортировать com.example.jandeksdiscography.screens.JandekApp импортировать com.example.jandeksdiscography.screens.FavoritePage импортировать com.example.jandeksdiscography.screens.ListenedPage // Список элементов нижней панели навигации val BotNavItems = listOf( НижнийНавигационныйItem( заголовок = "Домашняя страница", маршрут = Screen.HomePage.route, selectedIcon = Icons.Filled.Home, unselectedIcon = Icons.Outlined.Home, ), НижнийНавигационныйItem( заголовок = "Избранное", маршрут = Screen.Favorites.route, selectedIcon = Icons.Filled.Favorite, unselectedIcon = Icons.Outlined.FavoriteBorder, ), /* ДЕЛАТЬ: Импортируйте расширенные значки и попробуйте найти более подходящий для «слушал» */ НижнийНавигационныйItem( заголовок = "Слушано", маршрут = Screen.Listened.route, selectedIcon = Icons.Filled.CheckCircle, unselectedIcon = Icons.Outlined.CheckCircle, ), НижнийНавигационныйItem( заголовок = "О программе", маршрут = Экран.О.маршрут, selectedIcon = Icons.Filled.Info, unselectedIcon = Icons.Outlined.Info, ), ) @RequiresApi(Build.VERSION_CODES.O) @Композитный весело BottomNavigationBar() { // Реализация нижней панели навигации... var selectedItemIndex от RememberSaveable { изменяемыйStateOf (0) } /* Необходимо определить navController в Функция Боттомнавбар Используя RememberNavController(), мы можем получить экземпляр из навигационного контроллера */ val navController = RememberNavController() Поверхность ( модификатор = Модификатор.fillMaxSize(), цвет = MaterialTheme.colorScheme.background ) { Эшафот ( дноБар = { Панель навигации { // Проходим по всем элементам нижней панели навигации BottomNavItems.forEachIndexed { индекс, элемент -> НавигационныйБарItem( выбранный = selectedItemIndex == индекс, onClick = { selectedItemIndex = индекс navController.navigate(item.route) { popUpTo(navController.graph.findStartDestination().id) { saveState = правда } запускSingleTop = правда восстановлениестате = истина } }, метка = {Текст(текст = item.title)}, значок = { Икона( изображениеВектор = если (индекс == selectedItemIndex) { item.selectedIcon } Еще item.unselectedIcon, contentDescription = item.title ) } ) } } } ) {paddingValues-> NavHost( navController = navController, startDestination = Screen.HomePage.route, EnterTransition = {EnterTransition.None}, выходTransition = {ExitTransition.None}, модификатор = Modifier.padding(paddingValues ​​= paddingValues)) { составной (Screen.HomePage.route) { JandekApp(navController = navController) } составной (Screen.Favorites.route) { Любимая страница (navController = navController) } составной (Screen.Listened.route) { ListenedPage (navController = navController) } составной (Screen.About.route) { AboutPage (navController = navController) } } } } } Вот мой файл Screen.kt:

пакет com.example.jandeksdiscography.navigation const val COVER = "покрытие" const val NAME = "имя" const val YEAR = "год" const val TYPE = "тип" const val DURATION = "длительность" const val LISTEN_LINK = "listenLink" const val BUY_LINK = "buyLink" const val LYRICS = "тексты песен" const val IS_FAVORITE = "isFavorite" // Разрешает наследование только классам в этом файле запечатанный класс Screen (val маршрут: String) { объект HomePage: Screen("home_screen") object MoreScreen: Screen("more_screen{$COVER}/{$NAME}/{$YEAR}/{$TYPE}/{$DURATION}/{$LISTEN_LINK}/{$BUY_LINK}/{$IS_FAVORITE}/{$LYRICS }") { забавный passArgs ( обложка: Инт, имя: Строка, год: Строка, тип: Строка, продолжительность: Строка, прослушиваниеСсылка: строка, buyLink: Строка, isFavorite: логическое значение, текст: Струна ): Нить { return "more_screen$cover/$name/$year/$type/$duration/$listenLink/$buyLink/$isFavorite/$lyrics" } } object LyricsPage: Screen("lyrics_page{$NAME}/{$LYRICS}") { Веселый пропускТекст( имя: Строка, текст: Струна ): Нить { вернуть "lyrics_page$name/$lyrics" } } Избранное объекта: Screen("favorites_screen") Прослушанный объект: Screen("listened_screen") Об объекте: Экран("about_screen") объект NavHome: Screen("nav_home_screen") } Я пытался следовать этому руководству и пытался реализовать его в своем собственном проекте в течение последних двух дней, но так как я новичок в этом Я не продвинулся очень далеко. Любые указатели в правильном направлении будут иметь большое значение!
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»