在jetpack compose中分配记忆时,=操作符和保留字有什么区别?



我想知道两者的区别:

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只是一个创建记住委托的快捷函数,该委托将您在{ ... }块中创建的值包装起来。

一个典型的例子是kotlinLazy<T>类:val myValue : Int by lazy { 1 }。如果与by操作符一起使用,您将返回Int的值,如果与=操作符一起使用,它将返回Lazy<Int>,因为您没有使用委托。

还值得注意的是,委托也可以通过使用这个操作符fun来设置:operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: T).

相关内容

  • 没有找到相关文章

最新更新