Ссылка на LazyColumn возвращает начальное положение
У меня есть приложение. Большая картинка и снизу идет LazyColumn. Когда я перехожу по 4 (или 5) ссылке и потом назад мой LazyColumn оказывается в начальном положении. Ссылка 1 в самом верху. И когда я хочу снова ссылку 4 мне приходится "крутить".
Кнопка "Назад" на "родной" навигационной панели другая. Когда я возвращаюсь назад LazyColumn уже ждет меня в том виде, в котором я ее оставила.
Что нужно сделать в программе что бы и верхняя кнопка вела себя так-же как и кнопка "назад" на навигационной панели?
Вот мои файлы:
NavGraph.kt
@Composable
fun NavGraph (navController: NavHostController){
NavHost(navController = navController, startDestination = Screens.Contents.route
) {
addContentsScreen(navController, this)
addScreen1(navController, this)
addScreen2(navController, this)
addScreen3(navController, this)
addScreen4(navController, this)
addScreen5(navController, this)
}
}
private fun addContentsScreen(
navController: NavHostController,
navGraphBuilder: NavGraphBuilder
) {
navGraphBuilder.composable(route = Screens.Contents.route) {
ContentsScreen(
navigateScreen1 = { navController.navigate(Screens.Screens1.route) },
navigateScreen2 = { navController.navigate(Screens.Screens2.route) },
navigateScreen3 = { navController.navigate(Screens.Screens3.route) },
navigateScreen4 = { navController.navigate(Screens.Screens4.route) },
navigateScreen5 = { navController.navigate(Screens.Screens5.route) },
)
}
}
private fun addScreen1(navController: NavHostController, navGraphBuilder: NavGraphBuilder) {
navGraphBuilder.composable(route = Screens.Screens1.route) {
Screen1 (navigateContentsScreen = { navController.navigate(Screens.Contents.route) })
}
}
private fun addScreen2(navController: NavHostController, navGraphBuilder: NavGraphBuilder) {
navGraphBuilder.composable(route = Screens.Screens2.route) {
Screen2 (navigateContentsScreen = { navController.navigate(Screens.Contents.route) })
}
}
private fun addScreen3(navController: NavHostController, navGraphBuilder: NavGraphBuilder) {
navGraphBuilder.composable(route = Screens.Screens3.route) {
Screen3 (navigateContentsScreen = { navController.navigate(Screens.Contents.route) })
}
}
private fun addScreen4(navController: NavHostController, navGraphBuilder: NavGraphBuilder) {
navGraphBuilder.composable(route = Screens.Screens4.route) {
Screen4 (navigateContentsScreen = { navController.navigate(Screens.Contents.route) })
}
}
private fun addScreen5(navController: NavHostController, navGraphBuilder: NavGraphBuilder) {
navGraphBuilder.composable(route = Screens.Screens5.route) {
Screen5 (navigateContentsScreen = { navController.navigate(Screens.Contents.route) })
}
}
Screens
sealed class Screens(val route: String) {
data object Contents : Screens("contents_screen")
data object Screens1 : Screens("screen_1");
data object Screens2 : Screens("screen_2");
data object Screens3 : Screens("screen_3")
data object Screens4 : Screens("screen_4");
data object Screens5 : Screens("screen_5");
}
Screens.kt
class Item(val link: () -> Unit, val name: String)
@Composable
fun ContentsList(explanation: List<Item>) {
val listState = rememberLazyListState()
LazyColumn(state = listState) {
items(explanation.size) { index ->
val item = explanation[index]
ContentsButton(
onClick = item.link,
text = item.name
)
}
}
}
@Composable
fun ContentsScreen(
navigateScreen1: () -> Unit,
navigateScreen2: () -> Unit,
navigateScreen3: () -> Unit,
navigateScreen4: () -> Unit,
navigateScreen5: () -> Unit,
) {
val listOfQuestions = listOf(
Item( navigateScreen1, "Screen1"),
Item( navigateScreen2, "Screen2"),
Item( navigateScreen3, "Screen3"),
Item( navigateScreen4, "Screen4"),
Item( navigateScreen5, "Screen5"),
)
Column {
Image(
modifier = Modifier.height(650.dp),
painter = painterResource(id = R.drawable.cat),
contentDescription = null,
contentScale = ContentScale.Crop
)
ContentsList(listOfQuestions)
}
}
Screen4.kt
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Screen4(
navigateContentsScreen: () -> Unit,
) {
val text = "Screen4"
Scaffold(
containerColor = lightGray,
contentColor = darkGrey,
topBar = {
TopAppBar(
modifier = Modifier.height(80.dp),
title = {
Box(
Modifier.fillMaxHeight(),
contentAlignment = Alignment.Center
) {
Text(
maxLines = 1,
overflow = TextOverflow.Ellipsis,
text = text,
color = orange,
)
}
},
navigationIcon = {
Box(
Modifier.fillMaxHeight(),
contentAlignment = Alignment.Center
) {
IconButton(
onClick = navigateContentsScreen
) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = "Back",
tint = orange,
)
}
}
},
colors = TopAppBarDefaults.mediumTopAppBarColors(
containerColor = darkGrey
)
)
}
) { contentPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(contentPadding)
.verticalScroll(rememberScrollState()),
) {
Text(
text = "Screen4",
color = darkGrey,
textAlign = TextAlign.Justify,
modifier = Modifier.padding(24.dp)
)
}
}
}
Ответы (1 шт):
Автор решения: Alice Magic
→ Ссылка
Я нашла ответ. В файле NavGraph.kt нужно изменить код:
private fun addScreen4(navController: NavHostController, navGraphBuilder: NavGraphBuilder) {
navGraphBuilder.composable(route = Screens.Screens4.route) {
Screen4 (navigateContentsScreen = { navController.navigateUp() })
}
}
для всех пяти ссылок.
