如何使用BackdropScaffold正确实现Android编写嵌套导航

bqf10yzr  于 2023-01-28  发布在  Android
关注(0)|答案(1)|浏览(201)

我正在调查Jetpack Compose导航在我当前的Android应用程序中的使用情况。
我的应用程序"主页"屏幕使用androidx.compose.material.BackdropScaffold,其frontLayerContent设置如下:-

frontLayerContent = { MyNavigationHost(navController = navigator) }

这一切都按照应用程序中的顶级目的地的要求工作,因为这些顶级导航目的地被期望托管在背景中。
然而,从这些顶层屏幕(其容纳项目列表)中的每一个,用户应当能够点击列表项目并导航到背景不再可见的较低层屏幕,并且用户将看到具有向上箭头的简单工具栏,以向上导航一层回到父列表屏幕。
我已经创建了嵌套的导航目标,我可以达到,但我有两个问题,背景始终可见,即使在较低级别的细节屏幕
当用户返回时,他们导航到主屏幕(开始目的地),而不是他们查看列表时所在的实际高级屏幕。
我是否需要多个navHosts?其中一个navHosts包含背景frontContent中包含的所有顶级屏幕?
或者,我是否可以使用一个navHost并指定frontContentLayer应仅显示最高级别的屏幕?

    • 更新**

我想达到的目标是:
顶层屏幕T1T2T3,& T4都列在我的应用程序主屏幕的背景上,其中背景前内容设置如上所示;例如:

frontLayerContent = { MyTopLevelNavigationHost(navController = navigator) }

当用户导航到任何一个顶层屏幕时,他们应该仍然能够看到"汉堡包"工具栏并访问背景。2所有这些在我的应用程序中都是按要求工作的。
然而,当用户导航到这些顶级屏幕中的任何一个之下的级别时,我需要用显示向上箭头和基本工具栏标题的简单工具栏替换"汉堡包"工具栏。
我意识到我需要第二个NavHost用于这些"较低级别"屏幕,允许用户导航单独的子导航图,并让我用显示向上箭头和基本工具栏标题的简单工具栏替换"汉堡包"工具栏。我不知道如何实现第二个"较低级别" navHost。
我不知道如何"覆盖" backdropscaffold的frontcontent以显示较低级别的屏幕。

s8vozzvw

s8vozzvw1#

我是否需要多个navHosts?-〉是
我认为正确的方法是为背景设置一个导航图,将scaffold状态传递到前面层中显示的每个目的地,以便在必要时关闭它,并为背景scaffold设置一个顶级控制器,以防需要更改背景层中显示的内容。
//编辑开始
我真的想给予你一个代码示例,但这会占用我太多的时间。然而,我会把你能做的事情分成可理解的步骤,以达到你想要的。

  • 首先,创建一个顶层导航主机,其中包含背景支架屏幕和其他顶层屏幕。这样,您基本上可以将每个顶层屏幕放在导航图中的同一层级中。因此,只要您访问控制器,就可以导航到每个屏幕。

您可以轻松访问控制器,而无需将其传递到每个屏幕,方法如下:

// I put these in my Theme.kt as the composable itself 
// has the topmost hierarchy in each composable node

val LocalNavigationManager = compositionLocalOf<NavHostController> { error("No nav host found") }

// Then in your MaterialTheme composable
@Composable
fun MyTheme(isDark: Boolean = isSystemInDarkTheme()){
     val navController = rememberNavController()
    MaterialTheme(
        colors = colors,
        typography = typography,
    ) {
        CompositionLocalProvider(
             LocalNavigationManager provides navController
        )
    }

}

在构建NavHost时,将控制器作为LocalNavigationManager.current传递

  • 第二,在背景脚手架中为前一层创建一个子导航图。不要把那个导航图放在你的顶层层次结构中。只在你的前层使用它。你可以把你的任何顶层屏幕放在这个导航图中,或者你可以通过使用你可以从“LocalNaigationManager.current”获得的顶层控制器导航到任何顶层屏幕。有了这个,你既可以在前面导航-层层次结构或顶级层次结构。

我希望这能有所帮助,如果你有任何其他问题,我会再次编辑。

Very Late Edit for Hector 's Comment我所说的子导航图和典型的导航图没有什么不同。只需为你的前层创建另一个NavHost,而不是直接在前层调用一个可组合的,调用你创建的导航图。因为前层和后层都有不同的导航主机,它们仍然可以独立导航。

相关问题