Исправлена навигация

This commit is contained in:
2023-04-07 15:58:35 +03:00
parent a8184914de
commit 7e8a6cf260
5 changed files with 73 additions and 72 deletions
@@ -29,6 +29,8 @@ import com.kizitonwose.calendar.compose.weekcalendar.WeekCalendarLayoutInfo
import com.kizitonwose.calendar.compose.weekcalendar.WeekCalendarState import com.kizitonwose.calendar.compose.weekcalendar.WeekCalendarState
import com.kizitonwose.calendar.core.* import com.kizitonwose.calendar.core.*
import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.navigation.AppNavRoute
import ru.megboyzz.dnevnik.navigation.BaseNavRote import ru.megboyzz.dnevnik.navigation.BaseNavRote
import ru.megboyzz.dnevnik.ui.theme.dark import ru.megboyzz.dnevnik.ui.theme.dark
import java.time.DayOfWeek import java.time.DayOfWeek
@@ -49,13 +51,18 @@ fun SpacerHeight(height: Dp) = Spacer(Modifier.height(height))
@Composable @Composable
fun Int.AsImageVector() = ImageVector.vectorResource(this) fun Int.AsImageVector() = ImageVector.vectorResource(this)
@Composable
fun NavController.navigate(to: BaseNavRote){ fun NavController.navigate(to: BaseNavRote){
/*
LaunchedEffect(Unit){ LaunchedEffect(Unit){
navigate(to.route) { navigate(to.route) {
popUpTo(to.route) { inclusive = true } popUpTo(to.route) { inclusive = true }
} }
}*/
this.navigate(to.route){
launchSingleTop = true
} }
} }
fun Modifier.drawColoredShadow( fun Modifier.drawColoredShadow(
@@ -2,12 +2,18 @@ package ru.megboyzz.dnevnik.navigation
import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.navigation.NavGraph
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavigatorProvider
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.createGraph
import com.google.accompanist.navigation.animation.rememberAnimatedNavController import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
@@ -63,9 +69,15 @@ fun MarksSubScreenNavHost() {
remember { mutableStateOf(false) } remember { mutableStateOf(false) }
), ),
) )
Column {
SubScreenNavBar(list = list, subScreenNavController = navController)
//TODO - исправить костыль)))
// Костыль с перевернутым лайаутом: суть в том что NavHost создает NavGraph который использует
// SubScreenNavBar, но в колумне сначала идет SubScreenNavBar а потом NavHost, и где то из-за этого
// вылетает NPE, так как еще нет графа
LazyColumn(
reverseLayout = true
){
item {
NavHost( NavHost(
navController = navController, navController = navController,
startDestination = MarksNavRoute.LastMarks.route startDestination = MarksNavRoute.LastMarks.route
@@ -78,5 +90,10 @@ fun MarksSubScreenNavHost() {
composable(MarksNavRoute.ByYearMarks.route) { Text(MarksNavRoute.ByYearMarks.route) } composable(MarksNavRoute.ByYearMarks.route) { Text(MarksNavRoute.ByYearMarks.route) }
} }
} }
item {
SubScreenNavBar(list = list, subScreenNavController = navController)
}
}
} }
@@ -1,4 +1,4 @@
package ru.megboyzz.dnevnik.screens.ui package ru.megboyzz.dnevnik.screens.ui.main
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
@@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@@ -25,25 +23,6 @@ import ru.megboyzz.dnevnik.R
@Composable @Composable
fun BottomBar(navController: NavController) { fun BottomBar(navController: NavController) {
//Box(Modifier.fillMaxWidth().height(90.dp).shadow(8.dp))
// УЖАСНЫЙ КОСТЫЛЬ ДЛЯ ПЕРЕХОДОВ С ПОМОЩЬЮ СТЕЙТОВ TODO - УБРАТЬ
val goToMarks = remember { mutableStateOf(false) }
val goToHw = remember { mutableStateOf(false) }
val goToSchedule = remember { mutableStateOf(false) }
if(goToMarks.value){
navController.navigate(AppNavRoute.Marks)
//goToMarks.value = false
}
if(goToHw.value){
navController.navigate(AppNavRoute.HomeWorks)
//goToHw.value = false
}
if(goToSchedule.value){
navController.navigate(AppNavRoute.Schedule)
//goToSchedule.value = false
}
Box( Box(
modifier = Modifier modifier = Modifier
@@ -68,16 +47,19 @@ fun BottomBar(navController: NavController) {
) { ) {
BottomNavButton( BottomNavButton(
icon = R.drawable.ic_marks.AsPainter(), icon = R.drawable.ic_marks.AsPainter(),
text = R.string.title_marks.AsString() text = R.string.title_marks.AsString(),
) { goToMarks.value = true } onClick = { navController.navigate(AppNavRoute.Marks) }
)
BottomNavButton( BottomNavButton(
icon = R.drawable.ic_homework.AsPainter(), icon = R.drawable.ic_homework.AsPainter(),
text = R.string.title_hw.AsString() text = R.string.title_hw.AsString(),
) { goToHw.value = true } onClick = { navController.navigate(AppNavRoute.HomeWorks) }
)
BottomNavButton( BottomNavButton(
icon = R.drawable.ic_schedule.AsPainter(), icon = R.drawable.ic_schedule.AsPainter(),
text = R.string.title_schedule.AsString() text = R.string.title_schedule.AsString(),
) { goToSchedule.value = true } onClick = { navController.navigate(AppNavRoute.Schedule) }
)
} }
} }
} }
@@ -37,25 +37,7 @@ fun DrawerContent(
scaffoldState: ScaffoldState scaffoldState: ScaffoldState
) { ) {
// УЖАСНЫЙ КОСТЫЛЬ ДЛЯ ПЕРЕХОДОВ С ПОМОЩЬЮ СТЕЙТОВ TODO - УБРАТЬ
val goToMarks = remember { mutableStateOf(false) }
val goToHw = remember { mutableStateOf(false) }
val goToSchedule = remember { mutableStateOf(false) }
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
if(goToMarks.value){
navController.navigate(AppNavRoute.Marks)
scope.launch { scaffoldState.drawerState.close() }
}
if(goToHw.value){
navController.navigate(AppNavRoute.HomeWorks)
scope.launch { scaffoldState.drawerState.close() }
}
if(goToSchedule.value){
navController.navigate(AppNavRoute.Schedule)
scope.launch { scaffoldState.drawerState.close() }
}
Column( Column(
modifier = Modifier modifier = Modifier
.width(260.dp) .width(260.dp)
@@ -74,20 +56,36 @@ fun DrawerContent(
) { ) {
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_marks.AsPainter(), icon = R.drawable.ic_marks.AsPainter(),
text = R.string.title_marks.AsString() text = R.string.title_marks.AsString(),
) { goToMarks.value = true } onClick = {
navController.navigate(AppNavRoute.Marks)
scope.launch { scaffoldState.drawerState.close() }
}
)
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_homework.AsPainter(), icon = R.drawable.ic_homework.AsPainter(),
text = R.string.title_hw.AsString() text = R.string.title_hw.AsString(),
) { goToHw.value = true } onClick = {
navController.navigate(AppNavRoute.HomeWorks)
scope.launch { scaffoldState.drawerState.close() }
}
)
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_schedule.AsPainter(), icon = R.drawable.ic_schedule.AsPainter(),
text = R.string.title_schedule.AsString() text = R.string.title_schedule.AsString(),
) { goToSchedule.value = true } onClick = {
navController.navigate(AppNavRoute.Schedule)
scope.launch { scaffoldState.drawerState.close() }
}
)
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_settings.AsPainter(), icon = R.drawable.ic_settings.AsPainter(),
text = R.string.title_settings.AsString() text = R.string.title_settings.AsString(),
) { /* TODO */ } onClick = {
navController.navigate(AppNavRoute.Settings)
scope.launch { scaffoldState.drawerState.close() }
}
)
} }
Spacer(Modifier.weight(1f)) Spacer(Modifier.weight(1f))
Divider(color = white, thickness = 1.dp) Divider(color = white, thickness = 1.dp)
@@ -9,14 +9,12 @@ import androidx.compose.material.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import androidx.navigation.NavController
@@ -24,7 +22,6 @@ import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.AsPainter import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.SpacerWidth import ru.megboyzz.dnevnik.SpacerWidth
import ru.megboyzz.dnevnik.screens.ui.BottomBar
import ru.megboyzz.dnevnik.screens.ui.DrawerContent import ru.megboyzz.dnevnik.screens.ui.DrawerContent
import ru.megboyzz.dnevnik.screens.ui.drawerShape import ru.megboyzz.dnevnik.screens.ui.drawerShape
import ru.megboyzz.dnevnik.ui.theme.mainBlue import ru.megboyzz.dnevnik.ui.theme.mainBlue