“=记住”和“通过记住”有什么区别?

Sue*_*e97 54 android kotlin android-jetpack-compose

我发现有两种使用Remember API声明变量的方法。

第一个是:

@Composable
fun abc() {
    var aa = remember { mutableStateOf(true) }
}
Run Code Online (Sandbox Code Playgroud)

第二个是:

@Composable
fun abc() {
    var aa by remember { mutableStateOf(true) }
}
Run Code Online (Sandbox Code Playgroud)

两者之间有功能上的区别吗?或者它们只是为了方便?

小智 55

这只是为了方便,简化语法。通过使用委托(按关键字),您可以跳过与值相关的操作,因为它是在幕后完成的。

文档中您可以阅读

可通过三种方法在可组合项中声明 MutableState 对象:

val mutableState = Remember { mutableStateOf(default) }
var value by Remember { mutableStateOf(default) }
val (value, setValue) = Remember { mutableStateOf(default) }

这些声明是等效的,并且作为状态的不同用途的语法糖提供。您应该选择在您正在编写的可组合项中生成最容易阅读的代码的代码。

干杯


小智 38

我注意到这两种表达方式之间存在细微差别。

如果=使用

@Composable
fun abc() {
var aa = remember { mutableStateOf(true) }
}
Run Code Online (Sandbox Code Playgroud)

那么var aa将会是类型MutableState<Boolean>

如果by使用

@Composable
fun abc() {
var aa by remember { mutableStateOf(true) }
}
Run Code Online (Sandbox Code Playgroud)

那么var aa将会是类型Boolean

就我个人而言,我更喜欢使用by来保留原始类型。

  • 这是非常重要的一点。我认为等号更容易阅读,但发现我的所有代码都崩溃了,因为我将变量视为布尔值(而不是 MutableState)。+1 (11认同)

小智 8

在第一种情况下:每当您想使用“aa”的值时,您都必须使用“aa.value”。在第二种情况下:您不必这样做,因为在幕后您没有使用 var 的 getter。

额外的:

  • 你知道,每当你调用或编辑一个变量时,你都在调用它的 getter 和 setter 函数,所以当你使用“by”时,你正在使用另一个 getter 和 setter,它委托给另一段代码(通常是委托给函数)在“by”关键字之后),然后您不必使用“aa.value”,您只需在调用时写“aa”或在设置时写“aa = true”即可。
  • “var”具有 setter 和 getter 函数,因为它是可编辑的,而“val”只有 getter 而没有 setter,因为它不可编辑(只读)。

注意:如果您想阅读更多内容,请检查此答案以更好地理解这个概念:阅读更多内容