Reputation: 1
i build an compose application and i want to logout and navigate to login screen but app navigate to home screen, i use bottom navigation bar and nested navigation.
this is the button that will logout:
@Composable
fun ProfileContent(rootNavController: NavController) {
val authViewModel: AuthViewModel = viewModel()
//sign out
Button(
modifier = Modifier
.fillMaxWidth()
.wrapContentWidth(Alignment.CenterHorizontally),
onClick = {
authViewModel.signOut()
rootNavController.navigate("login"){
popUpTo("profile"){ inclusive = true }
}
}) {
Text(text = "Sign Out")
}
}
this the routes:
object Graph {
const val RootGraph = "root_graph"
const val HomeGraph = "home_graph"
const val AuthGraph = "auth_graph"
}
sealed class AuthRouteScreen(val route: String) {
data object Login : AuthRouteScreen("login")
data object SignUp : AuthRouteScreen("signUp")
data object Forgot : AuthRouteScreen("forgot")
}
sealed class HomeRoutesScreen(val route: String) {
data object Home : HomeRoutesScreen("home")
data object Scan : HomeRoutesScreen("scan")
data object Chat : HomeRoutesScreen("chat")
data object History : HomeRoutesScreen("history")
data object Profile : HomeRoutesScreen("profile")
}
this is the root nav:
@Composable
fun RootNavigationGraph() {
val viewModel = ViewModelProvider(LocalContext.current as ViewModelStoreOwner)[AuthViewModel::class.java]
val rootNavController = rememberNavController()
NavHost(
navController = rootNavController,
route = Graph.RootGraph,
startDestination = Graph.AuthGraph
) {
authNavGraph(rootNavController = rootNavController, viewModel = viewModel)
composable(route = Graph.HomeGraph) {
HomeScreen(rootNavController = rootNavController)
}
}
}
this is the Auth nav:
package com.example.cardiolink.graphs
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.navigation
import com.example.cardiolink.viewModels.AuthViewModel
import com.example.cardiolink.views.ForgotPasswordScreen
import com.example.cardiolink.views.LoginScreen
import com.example.cardiolink.views.RegisterScreen
import com.example.cardiolink.views.SplashScreen
fun NavGraphBuilder.authNavGraph(rootNavController: NavHostController, viewModel: AuthViewModel) {
navigation(
route = Graph.AuthGraph,
startDestination = AuthScreen.SPLASH.route
) {
composable(route = AuthScreen.SPLASH.route) {
SplashScreen(navController = rootNavController)
}
composable(route = AuthScreen.Login.route) {
LoginScreen(navController = rootNavController, viewModel)
}
composable(route = AuthScreen.SignUp.route) {
RegisterScreen(navController = rootNavController, viewModel)
}
composable(route = AuthScreen.Forgot.route) {
ForgotPasswordScreen(navController = rootNavController)
}
}
}
sealed class AuthScreen(val route: String) {
data object SPLASH : AuthScreen(route = "SPLASH")
data object Login : AuthScreen(route = "LOGIN")
data object SignUp : AuthScreen(route = "SIGN_UP")
data object Forgot : AuthScreen(route = "FORGOT")
}
this is the Home Nav:
@Composable
fun HomeNavGraph(
rootNavController: NavHostController,
homeNavController: NavHostController
) {
NavHost(
navController = homeNavController,
route = Graph.HomeGraph,
startDestination = Utils.Home.route
) {
composable(route = Utils.Home.route) {
HomeContent()
}
composable(route = Utils.Scan.route) {
ScanContent()
}
composable(route = Utils.Info.route) {
InfoContent()
}
composable(route = Utils.History.route) {
HistoryContent()
}
composable(route = Utils.Profile.route) {
ProfileContent(rootNavController = rootNavController)
}
}
}
i am tried to use nested navigation but didn't work and also sue separate navigation but also didn't work
Upvotes: 0
Views: 24