当前位置: 首页 > 知识库问答 >
问题:

为什么rememberSaveable变量被Android Studio北极狐标记为未使用?

宗晟
2023-03-14

Android 工作室北极狐(补丁 3)标记,“分配给 var 的 true已访问:从不使用以下可组合中的布尔值”:

@Composable
fun MainView(navController: NavController) {
    var isVisited by rememberSaveable { mutableStateOf(false) }

    if (!isVisited) {
        isVisited = true                    // never used?
        navController.navigate("NextView")
    }

    Button(onClick = { navController.navigate("NextView") }) {
        Text(text = "MainView")
    }
}

虽然它显然按预期工作:防止< code>MainView在随后访问< code>MainView时导航到< code>NextView。以下是< code>NextView的定义:

@Composable
fun NextView(navController: NavController) {
    Button(onClick = { navController.popBackStack() }) {
        Text(text = "NextView")
    }
}

Android Studio是否根本无法识别重新组合中的变量使用情况?或者是否有更惯用的方法在重新组合时有条件地执行代码?感谢任何回答或指针。

我用Kotlin 1.5.31,Compose 1.1.0-alpha06,navigation-Compose 2 . 4 . 0-alpha 04,life cycle-runtime-ktx 2 . 4 . 0-rc01为API Level 31进行构建,虽然我在API Level 30上看到过同样的行为,Kotlin 1.5.21,Compose 1.0.1,navigation-Compose 2 . 4 . 0-alpha 04,lifecycle-runtime-ktx 2.3.1。(如果有帮助的话,我很乐意分享我的< code>MainActivity,其中我设置了< code>NavHost的这两个视图或其他依赖项和系统信息。)

共有1个答案

微生翼
2023-03-14

studio code highlighter的设计考虑了传统的编程模型,即非声明性视图系统。在这种情况下,现代的可组合函数将被视为普通函数。现在在这个函数中,你创建一个变量,在一个条件中读取它,然后更新它的值。则该值在该html" target="_blank">函数的范围内永远不会被访问,因此会出现警告“更新后的值永远不会被使用”。

然而,我们现在是面向组合的,知道它是一个声明性的范例,并且重新组合是一件事情,凭借它,函数将被一次又一次地调用,因此更新的值实际上将在相同的条件中使用,这就是为什么< code>rememberSaveable块在那里开始。对于编译器来说也是一样,因为在更新之后,你从来没有在函数作用域中“键入变量的名称”,从传统的角度来看,这个值永远不会被再次使用,所以更新对于编译器(以及荧光笔)来说是没有意义的,因此出现了警告。忽略它是有意义的,但是如果你真的被它所困扰,只要在整个循环之后输入变量的名字,它就会消失。天啊,一年前我真是太笨了...

底线:您可以放心地忽略该警告,因为警告的目的是防止开发人员使用不必要的系统资源。由于一些内部荧光笔逻辑错误(也许?),它将一个有用的变量标识为未使用的变量,但是由于您知道您正在代码流中积极使用它,您可以放弃该警告。如果它困扰您,只需用注释将其抑制。

正文内容:-

不用麻烦了,这种情况时有发生。在我看来没有错误,只是尝试删除该行,然后在尽可能多地使用代码完成的同时重新添加它。如果这没有帮助,只需编译项目,并查看构建日志。如果它没有显示警告:var'isVisite'从未使用过,那么您可以放心,因为这将是工作室代码荧光笔中的一个错误。只要您没有收到任何构建时间警告,请确保它不会对性能或其他任何方面构成任何威胁。

 类似资料:
  • 问题内容: 我希望它不是重复的(同时鉴于存在此类错误的问题数量之多,但这是基本错误,同时也很难分辨),但我不明白这里会发生什么。 运行,没有错误(将字符转换为ASCII代码,它是内置的)。现在: 也可以运行,没有错误(不会被覆盖,条件始终为false)。现在: 我得到(在哪里) 看起来,即使不运行代码,仅引用左侧操作数也会使其成为局部变量。 显然,我可以解决此问题,但令我感到 非常 惊讶的是,由于

  • 变量被编译器声明为const,导致无法编译

  • 如果我有: 很明显,这个表达式后面的应该是零,但我看到的任何地方,他们都说这个代码的行为是未定义的,而不仅仅是的值(直到减法之前)。 很明显,编译器可以简单地在变量中使用它认为“方便”的任何垃圾值,并且它将按照预期工作。这种方法有什么问题?

  • 问题内容: 我在Linux中编写了一个C程序,使用来设置环境变量的值,但是执行后,当我运行或时,环境变量本身似乎未设置。为什么? 这是代码片段: 问题答案: 环境变量在程序的上下文中设置。 程序退出时,您将返回到程序启动所在的上下文。

  • 问题内容: 出于好奇,为什么< img >标签没有在 HTML中 关闭? 我还注意到,< img >标记在 XHTML中 已显式关闭。 问题答案: 从历史上看,HTML一直基于SGML,它允许在某些情况下省略标签。 由于元素不能有任何子节点,因此将其定义为EMPTY,并且禁止使用end标签(因为它将毫无用处)。 XHTML是用XML表示的HTML,并且XML不支持可选或禁止的标签(尽管它允许使用自

  • 问题内容: 当我的PHP脚本从AJAX POST请求接收数据时,将对变量进行转义。真正奇怪的是,这仅发生在我的生产服务器(在Linux上运行PHP 5.2.12)上,而不在我的本地服务器(在Windows上运行PHP 5.3.1)上发生。 这是AJAX代码: 这有什么原因吗?我应该如何解决这个问题,使其在两台服务器上都能正常工作? 编辑:我对magic_quotes具有以下设置: 问题答案: 您可