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



Android Studio Arctic Fox (Patch 3) flags, "在下面的组合中,true赋给var isVisited: Boolean的值从未被使用";

@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")
}
}

,而它显然是按预期工作:防止MainView导航到NextView在随后访问MainView。以下是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-alpha04、lifecycle-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-alpha04、lifecycle-runtime-ktx 2.3.1上看到了相同的行为。(我很乐意分享我的MainActivity,我设置NavHost与这两个视图或其他依赖关系和系统信息,如果有帮助的话。)

2022答案:

studio代码高亮显示是根据传统的编程模型设计的,即非声明性的视图系统。在这种情况下,现代可组合对象将被视为一个常规函数。现在在这个函数中,您创建了一个变量,在条件语句中读取它,然后更新它的值。那么该值永远不会在该函数的作用域中被访问,因此会出现警告"更新后的值永远不会被使用"。

然而,我们现在是面向组合的,知道它是一种声明性范例,并且重组是一种东西,通过它,函数将被一遍又一遍地调用,因此更新的值实际上将在相同的条件中使用,这就是为什么rememberSaveable块在那里开始。对于编译器也是如此,因为您永远不会键入变量的名称。在更新后的函数作用域中,从传统的方式来看,该值再也不会被使用,因此更新对编译器(以及高亮笔)来说是毫无意义的,因此会出现警告。只有忽略它才有意义,但如果你真的被它困扰了,只要在整个循环之后输入变量名,它就会消失。天哪,一年前我真是太笨了……

2021年前完成;不那么可靠。请随意忽略

TOP OF THE LINE:你可以安全地忽略这个警告,因为警告的目的是防止开发人员使用不必要的系统资源。由于某些内部高亮显示逻辑错误(也许?),它将有用的变量标识为未使用的变量,但由于您知道您正在代码流中积极使用它,因此可以忽略该警告。

正文内容:-

别麻烦了,这种事时有发生。对我来说似乎没有错误,只是尝试删除行,然后重新添加它,同时使用尽可能多的代码完成。如果没有帮助,只需编译项目,并查看构建日志。如果它没有显示警告:var 'isVisited' is never used,那么您可以放心,因为它可能是工作室代码高亮中的错误。只要您没有收到任何构建时警告,请确保它不会对性能或其他方面构成任何威胁。

相关内容

  • 没有找到相关文章

最新更新