我想知道两者的区别:
var textFieldState = remember {
mutableStateOf("")
}
和
var textFieldState by remember {
mutableStateOf("")
}
有什么优势吗?
有什么优势吗?
第一个应该是val
而不是var
。否则,它们是等价的。或者,引用文档:
在可组合对象中声明MutableState对象有三种方法:
val mutableState = remember { mutableStateOf(default) }
var value by remember { mutableStateOf(default) }
val (value, setValue) = remember { mutableStateOf(default) }
这些声明是等价的,并且作为语法糖提供给不同的状态用法。您应该选择在您正在编写的可组合程序中生成最容易阅读的代码的代码。
- 在第一个,
mutableState
保存一个MutableState
,你使用.value
和.value=
来操作 的内容 - 第二,
value
持有一个MutableState
,但是by
的语法告诉编译器把它当作一个属性委托,所以我们可以假装value
只持有底层数据 - 第三,解构声明为您提供getter和setter引用,以操纵底层
MutableState
中的内容。
这里的by
是一个kotlin属性委托。任何实现操作符funoperator fun getValue(thisRef: Any?, prop: KProperty<*>): T
的类都可以使用此语法。使用=
将急切地赋值变量(重要的是没有委托),by
将委托给操作符函数。在这种情况下,remember
只是一个创建记住委托的快捷函数,该委托将您在{ ... }
块中创建的值包装起来。
Lazy<T>
类:val myValue : Int by lazy { 1 }
。如果与by
操作符一起使用,您将返回Int
的值,如果与=
操作符一起使用,它将返回Lazy<Int>
,因为您没有使用委托。
还值得注意的是,委托也可以通过使用这个操作符fun来设置:operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: T)
.