android Jetpack编写嵌套导航和BottomAppBar

fquxozlt  于 2023-06-20  发布在  Android
关注(0)|答案(2)|浏览(214)

我尝试使用jetpack编写导航,但在理解嵌套导航和布局scaffold时遇到了问题。
我有一个这样的应用程序屏幕结构

  1. root
  2. ├─ A
  3. ├─ B <- Had a bottom navigation bar
  4. ├─ C
  5. ├─ D

这是粗略的规格

  • 根将位于MainActivity中,并具有NavHost和scaffold。
  • A和B中的应用程序栏将是不同的。
  • 在B中有一个底部导航栏,可用于在C和D之间导航

我一直在浏览文档和StackOverflow,从我得到的信息来看,最好把脚手架放在NavHost之外。
但是,对于我的情况,如果我不能访问A & B中的脚手架,我如何更新A和B中的应用程序栏?我只能像下面的代码那样在脚手架中做一个分支

  1. Scaffold(
  2. scaffoldState = scaffoldState,
  3. topBar = {
  4. when {
  5. currentDestination?.parent?.route == "Home" -> {
  6. TopAppBar(
  7. title = {
  8. Text("Home")
  9. },
  10. )
  11. }
  12. currentDestination?.route == "Other screen" -> {
  13. ....
  14. }

我还需要一个进入脚手架的状态。
那么,解决这类问题的最佳方法是什么呢?

oyt4ldly

oyt4ldly1#

我有这个问题与NavHost和嵌套导航与multiScaffold

以下是我的第一个解决方案:

根目录有自己的NavHost,包含两个独立的页面(A & B),这些页面有自己的功能。
如果我们认为页面A是像Splash Screen一样的单个页面,我们有一个基本的Scaffold组件。
如果我们认为B页是一种带有底部导航的多页,就像Instagram一样,那么在顶层,我们应该为自己的页面创建一个NavHost
这是我们的根:

  1. sealed class RouteScreen(val route: String) {
  2. object A : RouteScreen("a")
  3. object B : RouteScreen("b")
  4. }
  5. @Composable
  6. internal fun RootNavigation(
  7. modifier: Modifier = Modifier,
  8. appState: MultiNavigationAppState
  9. ) {
  10. NavHost(
  11. navController = appState.navController,
  12. startDestination = RouteScreen.A.route,
  13. modifier = modifier
  14. ) {
  15. addA(appState)
  16. addB(appState)
  17. }
  18. }
  19. private fun NavGraphBuilder.addA(
  20. appState: MultiNavigationAppState
  21. ) {
  22. composable(route = RouteScreen.A.route) {
  23. AScreen()
  24. }
  25. }
  26. private fun NavGraphBuilder.addB(
  27. appState: MultiNavigationAppState
  28. ) {
  29. composable(route = RouteScreen.B.route) {
  30. BScreen(appState)
  31. }
  32. }

AScreen是一个可组合的,你可以在其中使用Scaffold
BScreenAScreen相同,但您可以为控制选项卡创建另一个NavHost

  1. @Composable
  2. fun BScreen(
  3. appState: MultiNavigationAppState
  4. ) {
  5. val mainState = rememberMainState()
  6. Scaffold(
  7. bottomBar = {...}
  8. ) {
  9. BNavigation(...)
  10. }
  11. }

实际上,不建议使用一个带有嵌套导航的NavHost,因为如果页面有标签和Instagram等功能,我们就会遇到麻烦。
第二种解决方案是我们可以使用多个fragment和自己的NavHost, but it's not all based on Composable`组件。
正如您提到的,我遇到了这个问题,您可以获得有关this Github project的更多帮助

展开查看全部
sqougxex

sqougxex2#

请在Medium上阅读这篇article文章,以了解使用底部导航栏和嵌套导航实现嵌套导航的正确方法。
我希望这对你有帮助。

相关问题