android 如何在Jetpack Compose中应用嵌套导航

7xzttuei  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(237)

我使用的内容:

Kotlin,Jetpack Compose

我想做的事:

单击“登录”文本后,我希望将用户导航到登录表单

我目前拥有的:

  • MainActivity.kt*
  1. class MainActivity : ComponentActivity() {
  2. private val viewModel: MainActivityViewModel by viewModels()
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. installSplashScreen().apply {
  6. setKeepOnScreenCondition {
  7. viewModel.isLoading.value
  8. }
  9. }
  10. setContent {
  11. RestaurantioTheme {
  12. Surface(Modifier.fillMaxSize()) {
  13. val navController = rememberNavController()
  14. Scaffold(
  15. content = {padding ->
  16. Column(
  17. modifier = Modifier.padding(padding)
  18. ) {
  19. Navigation(navController = navController)
  20. }
  21. },
  22. bottomBar = {
  23. BottomNavigationBar(
  24. items = listOf(
  25. BottomNavItem(
  26. name = "Home",
  27. route = "home",
  28. icon = Icons.Outlined.Home
  29. ),
  30. BottomNavItem(
  31. name = "Orders",
  32. route = "orders",
  33. icon = Icons.Outlined.ShoppingBag
  34. ),
  35. BottomNavItem(
  36. name = "Map",
  37. route = "map",
  38. icon = Icons.Outlined.Map
  39. ),
  40. BottomNavItem(
  41. name = "Profile",
  42. route = "profile",
  43. icon = Icons.Outlined.Person
  44. ),
  45. ),
  46. navController = navController,
  47. onItemClick = {
  48. navController.navigate(it.route) {
  49. popUpTo(navController.graph.findStartDestination().id) {
  50. saveState = true
  51. }
  52. launchSingleTop = true
  53. restoreState = true
  54. }
  55. }
  56. )
  57. }
  58. )
  59. }
  60. }
  61. }
  62. }
  63. }
  • BottomNav.kt*
  1. @Composable
  2. fun Navigation (navController: NavHostController) {
  3. NavHost(navController = navController, startDestination = "home" ) {
  4. composable("home") {
  5. HomeScreen()
  6. }
  7. composable("orders") {
  8. OrdersScreen()
  9. }
  10. composable("map") {
  11. MapScreen()
  12. }
  13. composable("profile") {
  14. ProfileScreen()
  15. }
  16. composable("login") {
  17. MapScreen()
  18. }
  19. }
  20. }

我尝试过的:

在我的ProfileScreen()Composable中,我有

  1. ClickableText(
  2. AnnotatedString("Log In"),
  3. onClick = {
  4. })

但我无法导航到登录屏幕。我试过这样的方法:

  1. val navController = rememberNavController()
  2. Navigation(navController)
  3. ClickableText(
  4. AnnotatedString("Log In"),
  5. onClick = {
  6. navController.navigate("login")
  7. })

但是它并没有像预期的那样工作,因为我在ProfileScreen上面有HomeScreen(开始屏幕),在单击LogIn文本之后,我有这个“临时”MapScreen。
我知道我做错了什么,但我刚刚开始学习编写,我不能真正理解嵌套导航的导航文档,我认为应该在这里使用。
如果有帮助的话,下面是ProfileScreen Composable的开始,也许我必须在那里传递一些参数。

  1. @Composable
  2. fun ProfileScreen(viewModel: AuthenticationViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {
  3. ...
  4. }

2hh7jdfx

2hh7jdfx1#

您可以将函数作为参数添加到ProfileScreen,并将此函数用于onClick事件。

  1. ProfileScreen(goToLogin: () -> Unit){
  2. ...
  3. ClickableText(
  4. AnnotatedString("Log In"),
  5. onClick = goToLogin
  6. )
  7. }

在Navigation组合中,您可以将函数添加到ProfileScreen组合中,如下所示

  1. val goToLogin = remember{{ navController.navigate("login") }}
  2. composable("profile") {
  3. ProfileScreen(goToLogin = goToLogin)
  4. }

相关问题