TopAppBar 与导航集成的支架

2023-12-15

如何在中显示导航图标(后退箭头或菜单)TopAppBar using Scaffold基于 NavController 中的实际位置?我在用使用 Compose 1.0.0-alpha02 进行导航。下面是一个示例代码,描述了它应该如何工作

@Composable
fun App()
{
    val navController = rememberNavController()

    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = "App title") },
                navigationIcon = {

                    /*
                    Check if navController back stack has more
                    than one element. If so show BackButton.
                    Clicking on that button will move back
                     */

                    val canMoveBack = true

                    if (canMoveBack)
                    {
                        IconButton(onClick = {
                            // Move back
                            navController.popBackStack()
                        }) {
                            Icon(asset = Icons.Outlined.ArrowBack)
                        }
                    } 
                    else
                    {
                        IconButton(onClick = {
                            // show NavDrawer
                        }) {
                            Icon(asset = Icons.Outlined.Menu)
                        }
                    }
                },
            )
        },
        bodyContent = {
            AppBody(navController)
        }
    )
}

我想到了类似的事情navController.backStack.size但我得到了错误NavController.getBackStack can only be called from within the same library group (groupId=androidx.navigation).

第二个问题,如果我想改变TopAppBartext 我是否必须提升此文本并为每个“屏幕”提供更改此文本的可能性,或者是否有任何简单的内置方法可以像标准视图系统中那样执行此操作?


谢谢阿卜杜利拉·艾尔·艾萨维我已经知道如何用一个来做到这一点Scaffold只是改变bodyContent。在这个方法中,我们不需要通过navController对于任何主体元素,一切都在基本应用程序可组合项中完成。下面的代码可以在两个实体之间导航(课程 -> 学生)

App:

@Composable
fun App(
    viewModel: MainViewModel
)
{
    val navController = rememberNavController()

    val baseTitle = "" // stringResource(id = R.string.app_name)
    val (title, setTitle) = remember { mutableStateOf(baseTitle) }

    val (canPop, setCanPop) = remember { mutableStateOf(false) }

    val scaffoldState: ScaffoldState = rememberScaffoldState()

    navController.addOnDestinationChangedListener { controller, _, _ ->
        setCanPop(controller.previousBackStackEntry != null)
    }

    // check navigation state and navigate
    if (viewModel.navigateToStudents.value)
    {
        navController.navigate(route = STUDENT_SCREEN_ROUTE)
        viewModel.studentsNavigated()
    }

    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = title) },
                navigationIcon = {

                    if (canPop)
                    {
                        IconButton(onClick = {
                            navController.popBackStack()
                        }) {
                            Icon(asset = Icons.Outlined.ArrowBack)
                        }
                    }
                    else
                    {
                        IconButton(onClick = {
                            scaffoldState.drawerState.open()
                        }) {
                            Icon(asset = Icons.Outlined.Menu)
                        }
                    }
                },
            )
        },
        scaffoldState = scaffoldState,
        drawerContent = {
            DrawerContent()
        },
        bodyContent = {
            AppBody(
                viewModel = viewModel,
                navController = navController,
                setTitle = setTitle
            )
        }
    )
}

AppBody

@Composable
fun AppBody(
    viewModel: MainViewModel,
    navController: NavHostController,
    setTitle: (String) -> Unit,
)
{
    NavHost(
        navController,
        startDestination = LESSON_SCREEN_ROUTE
    ) {
        composable(route = LESSON_SCREEN_ROUTE) {
            LessonBody(
                viewModel = viewModel,
                setTitle = setTitle
            )
        }
        composable(
            route = STUDENT_SCREEN_ROUTE
        ) {
            StudentBody(
                viewModel = viewModel,
                setTitle = setTitle
            )
        }
    }
}

在 ViewModel 中,我使用此模式进行导航:

private val _navigateToStudents: MutableState<Boolean> = mutableStateOf(false)
val navigateToStudents: State<Boolean> = _navigateToStudents

fun studentsNavigated()
{
    // here we can add any logic after doing navigation
    _navigateToStudents.value = false
}

所以当我想导航到下一个片段时我只需设置_navigateToStudents.value = true

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TopAppBar 与导航集成的支架 的相关文章

随机推荐

  • 无法通过 Delphi 2010 和 Indy 10.5.5 使用与 Office365 的安全 SMTP 连接

    任何人都可以诊断我使用 Delphi 2010 和 Indy 10 5 5 连接到 smtp office365 com 的失败吗 我已经阅读了 Indy 专家 Remy Lebeau 在这个问题中提供的代码示例 将 INDY 10 SMT
  • ASP.NET MVC ContactsManager 教程中是否有解决依赖注入循环问题的好/正确方法?

    如果您不知道我在说什么 请查看教程并尝试自己添加依赖注入 或者尝试我对问题的解释 Note 此问题不属于 ASP NET 原始教程的范围 本教程仅表明所使用的模式是依赖注入友好的 问题基本上是控制器 ModelStateWrapper 和
  • javascript 函数中的“return this”有什么作用?

    我想知道 return this 在 javascript 函数中做什么 它的目的是什么 假设我们有以下代码 Function prototype method function name func this prototype name
  • 有没有办法通过自定义事件传递附加数据?

    我需要在两个自主用户脚本之间传递数据 理想情况下不接触unsafeWindow对象 我认为使用自定义事件是可行的方法 我想到了这样的事情 为了示例的目的 让我们忽略 MSIE 模型 addEventListener customEvent
  • 如何获得 compose 中的活动

    有没有办法获取撰写功能中的当前活动 Composable fun CameraPreviewScreen val context ContextAmbient current if ActivityCompat checkSelfPermi
  • 如何在 Mac 上使用 cx_Freeze?

    我在我的 Mac 上使用了 python 3 4 和 cx Freeze 我试图将我的 python 脚本转换为独立的应用程序 这是我在 setup py 文件中获得的代码 application title Death Dodger 1
  • 将共享文件夹路径转换为 ​​UNC 路径

    我正在尝试通过使用计算机名称操作当前路径来将当前共享文件夹路径转换为 unc 路径 但是会导致编译错误 公共函数 UNCpath 中的 elem UBound CurrentPathA 行上存在预期数组 你们能告诉我造成这个问题的原因是什么
  • Firefox XPCOM 组件 - 调用方法 UnnamedClass 的权限被拒绝

    Firefox XPCOM 组件可以跨多个页面读写页面内容吗 设想 一堆本地 HTML 和 javascript 文件 Main html 文件打开一个窗口 pluginWindow 并使用以下命令创建一个插件 netscape secur
  • 使用RVM安装Ruby 1.9.2时出现Curl证书错误

    尝试下载 Ruby 1 9 2 时 RVM 遇到证书错误 看起来像curl存在证书问题 但我不知道如何绕过它 我在下面包含了确切的错误信息 rvm install 1 9 2 Installing Ruby from source to U
  • 使用指令内在函数在 Hexagon DSP 中启用 HVX SIMD

    我使用 Hexagon SDK 3 0 编译 HVX DSP 架构的示例应用程序 有许多与 Hexagon LLVM 相关的工具可供使用 位于以下文件夹 Qualcomm HEXAGON Tools 7 2 12 Tools bin 我编写
  • 如何打印画布元素?

    我的页面上有一个画布元素 我在其上绘制图像以及用户输入的一些数据 按一下按钮 我想将画布发送到打印机 将其打印在纸上 我尝试使用这个插件 jQuery printElement 像那样 按钮代码 a href PRINT a print v
  • iOS 应用程序相机访问被拒绝 iOS 9.1(黑屏)

    我想在我的应用程序中访问相机 我正在尝试以下代码 if UIImagePickerController isSourceTypeAvailable UIImagePickerControllerSourceTypeCamera UIImag
  • 在 eclipse luna 中启用 javascript 验证

    前段时间我问过这个问题 为 eclipse 启用 javascript 验证 我希望 Eclipse 突出显示 javascript 错误 警告 您在答案中看到的问题是该项目未配置为 Javascript Nature 现在我迁移到 Ecl
  • 何时使用内容提供商

    我了解内容提供商的目的是允许在应用程序之间公开共享数据 但是 我想知道是否有人有关于制作一个内容提供程序以仅在您自己的应用程序中使用的想法 这样做有什么好处吗 有什么缺点吗 过去 我刚刚实现了 SQliteOpenHelper 来访问数据库
  • 我可以使用 VBA 将网络图像 (gif) 导入到 Excel 中吗?

    我在 Excel 工作表中有一个 gif 文件的 URL 列表 我想使用 VBA 查询这些网站并将这些图像插入到同一个工作表中 我使用的是 Excel 2007 我尝试使用 获取外部数据 从网络 功能来查询网站 但返回以下错误 打不开htt
  • 为什么绝对定位的元素由其同级元素放置,而不是放置在页面的顶角?

    我不明白为什么我的绝对定位元素出现在我的之后child static分区我一直认为绝对定位的元素会从流程中取出 那么为什么不呢child absolute覆盖child static div parent position relative
  • 使用utf8编码的Perl脚本,它可以打开GB2312编码的文件名吗?

    我不是在谈论以 utf 8 或非 utf 8 编码读取文件内容之类的内容 这是关于文件名的 通常我将 Perl 脚本保存为系统默认编码 在我的情况下为 GB2312 并且不会遇到任何文件打开问题 但出于处理目的 我现在有一些以 utf 8
  • 检查异常是编译时还是运行时? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我读到有关检查异常的内容 它由编译器检查 但仅在运行时检查 这是对的吗 如果正确的话又如何呢 检查异常在编译时进行检查 以确保您正在处理它们 方法是捕获它们或声明包含方法throws例
  • HTMLUnit 不等待 Javascript

    我有一个基于 GWT 的页面 我想使用 HtmlUnit 为其创建 HTML 快照 该页面使用产品上的 Ajax JavaScript 信息进行加载 因此大约 1 秒后会出现 正在加载 消息 然后显示内容 问题是 HtmlUnit 似乎没有
  • TopAppBar 与导航集成的支架

    如何在中显示导航图标 后退箭头或菜单 TopAppBar using Scaffold基于 NavController 中的实际位置 我在用使用 Compose 1 0 0 alpha02 进行导航 下面是一个示例代码 描述了它应该如何工作