我是 jetpack compose 的新手,正在尝试了解 remember
和 mutableStateOf
之间的区别
换句话说,这条线之间的尊重
val text = remember{ mutableStateOf("") }
还有这个
val text = remember{ "" }
还有这个
val text = mutableStateOf("")
答案 0 :(得分:14)
remember
是一个可组合的函数,可用于缓存昂贵的操作。您可以将其视为可组合对象本地的缓存。
val state: Int = remember { 1 }
上面代码中的 state
是不可变的。如果您想更改该状态并更新 UI,您可以使用 MutableState
。 Compose
观察对 MutableState
对象的任何读取和写入,并触发 recomposition 以更新 UI。
val state: MutableState<Int> = remember { mutableStateOf(1) }
Text(
modifier = Modifier.clickable { state.value += 1 },
text = "${state.value}",
)
另一个变体(在 alpha12
中添加)称为 rememberSaveable
,它类似于 remember
,但存储的值可以在进程终止或配置更改后继续存在。
val state: MutableState<Int> = rememberSaveable { mutableStateOf(1) }
注意:您还可以使用属性委托作为语法糖来解开 MutableState
。
var state: Int by remember { mutableStateOf(1) }
关于您问题的最后一部分,如果您在可组合中执行如下所示的操作,则您只是在创建一个 MutableState
对象。
val state: MutableState<Int> = mutableStateOf { 1 }
MutableState
是使用 LiveData
或 Flow
的替代方法。 Compose
默认情况下不会观察到此对象的任何更改,因此不会发生重组。如果您希望观察更改并缓存状态,请使用 remember
。如果不需要缓存而只想观察,可以使用derivedStateOf
。这是如何使用它的sample。
答案 1 :(得分:1)
基本上,在第一个示例中,您存储的是可变值,而在第二个示例中,您存储的是不可变值。
根据文档:“在缓存昂贵的 UI 操作(例如计算文本格式)时,您可以存储不可变值。记住的值与称为记住的可组合存储在组合中。” Source
有关 mutableStateOf 的更多信息,请参阅文档 link。当您希望在您的值发生变化时重新组合您的 UI 时,您可以使用它。
答案 2 :(得分:1)
remember 关键字可以存储可变或不可变对象。如果您传递 mutableStateOf 来记住,只要该对象的值发生变化,它就会强制重新组合正在读取该值的可组合项。