“= remember”和“by remember”之间有什么区别?

51

我认为“记住”的两个用例存在。
第一个是

@Composable
fun abc() {
    var aa = remember { mutableStateOf(true) }
}

其次

@Composable
fun abc() {
    var aa by remember { mutableStateOf(true) }
}

是否存在功能差异?还是只是为了方便?

3个回答

49

这只是为了方便起见,简化语法。通过使用delegate(关键字),您可以跳过与值相关的内容,因为它在幕后完成。

文档中,您可以阅读到:

有三种方式在composable中声明MutableState对象:

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

这些声明是等效的,并提供作为状态不同用法的语法糖。您应该选择产生易于阅读的代码的声明方式,以编写您正在编写的composable。

干杯!


30
我注意到这两个表达之间有一点小差别。
如果使用等号=的话。
@Composable
fun abc() {
var aa = remember { mutableStateOf(true) }
}

那么var aa的类型将为MutableState<Boolean>

如果使用by的话

@Composable
fun abc() {
var aa by remember { mutableStateOf(true) }
}

那么 var aa 的类型将是 Boolean

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


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

7
在第一种情况下,每当你想使用"aa"的值时,都必须使用"aa.value"来访问该值。在第二种情况下,由于底层没有使用变量的getter函数,因此不需要这样做。
此外: - 当调用或编辑变量时,你实际上在调用其getter和setter函数,因此在使用"by"时,你使用的是另一个getter和setter,这些函数被委托给其他代码(通常是在"by"关键字后面的函数),然后在调用时可以直接写成"aa",设置时可以直接写成"aa = true"。 - "var"拥有setter和getter函数,因为它是可编辑的;而"val"只有getter函数,因为它是不可编辑的(只读)。
注意:如果你想了解更多,请查阅以下回答以更好地理解这个概念:查看更多

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接