Colton Idle
07/25/2021, 1:30 AMBryan L
07/25/2021, 2:23 AM@Composable
fun AppRouter() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Screen.HomeScreen.route) {
composable(Screen.HomeScreen.route) { HomeScreen(navController = navController) }
composable(Screen.SignInScreen.route) { SignInScreen(navController = navController) }
}
}
sealed class Screen(val route: String) {
object HomeScreen : Screen("home")
object SignInScreen : Screen("signin")
}
@Composable
fun AppRouter() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Screen.HomeScreen.route) {
composable(Screen.HomeScreen.route) { HomeScreen(navController = navController) }
composable(Screen.LoginScreen.SignInScreen.route) { SignInScreen(navController = navController) }
}
}
sealed class Screen(val route: String) {
object HomeScreen : Screen("home")
sealed class LoginScreen {
object SignInScreen : Screen("signin")
object RegisterScreen : Screen("register")
}
}
You could also do something like this if you'd prefer to show it as subroute. Someone else will give better insight. But just some food for thought! (still only calls "signin". You can play around with it. 🙂 )
fun AppRouter() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Screen.HomeScreen.route) {
composable(Screen.HomeScreen.route) { HomeScreen(navController = navController) }
composable(Screen.LoginScreen.SignInScreen.subRoute) { SignInScreen(navController = navController) }
}
}
sealed class Screen(val route: String) {
object HomeScreen : Screen("home")
sealed class LoginScreen(val subRoute: String) : Screen("login") {
object SignInScreen : LoginScreen("signin")
object RegisterScreen : LoginScreen("register")
}
Abhishek Dewan
07/25/2021, 2:33 AMColton Idle
07/25/2021, 2:35 AMAbhishek Dewan
07/25/2021, 2:47 AMColton Idle
07/25/2021, 8:54 PMAdam Powell
07/25/2021, 9:18 PMColton Idle
07/26/2021, 2:08 AMAdam Powell
07/26/2021, 2:15 AMColton Idle
07/26/2021, 2:16 AMyou could go either way depending on the shape of the rest of your code.What's either way? I figured the only option is to pass in a lambda, or do what I'm doing currently (calling navigate directly). Is there another option?
Adam Powell
07/26/2021, 2:17 AMColton Idle
07/26/2021, 2:22 AMAdam Powell
07/26/2021, 2:39 AMnavController
instead of Unit
as the key parameter to LaunchedEffect
Colton Idle
07/26/2021, 2:43 AMAdam Powell
07/26/2021, 2:44 AMLaunchedEffect
launches a coroutine to run the trailing lambda block when it first enters composition and cancels it when it leaves the composition. If any of the key parameters change while the LaunchedEffect
is still present, then it will cancel the coroutine and start a new one again.LaunchedEffect
won't change its lambda capture out from under the running coroutine, at least not on its own.navController
here is wrong and Unit
is more correct in this situation.Colton Idle
07/26/2021, 2:47 AMfirst enters composition and cancels it when it leaves the composition.Hm. Let me make sure I understand. "first enters composition" is like when a HomeScreen composable is added to the NavHost? or by "enter composition" do you mean everytime it recomposes it "enters composition"
Adam Powell
07/26/2021, 2:49 AMColton Idle
07/26/2021, 2:51 AMAdam Powell
07/26/2021, 2:52 AMColton Idle
07/26/2021, 2:52 AMAdam Powell
07/26/2021, 2:52 AMremember { }
any object that implements RememberObserver
, compose will invoke its callbacks during these events of the composition lifecycleColton Idle
07/26/2021, 2:53 AMAdam Powell
07/26/2021, 2:54 AM