android jetpack compose 中的“remember”和“mutableState”有什么区别?

时间:2021-02-12 09:51:04

标签: android android-jetpack android-jetpack-compose

我是 jetpack compose 的新手,正在尝试了解 remembermutableStateOf 之间的区别


换句话说,这条线之间的尊重

val text = remember{ mutableStateOf("") }

还有这个

val text = remember{ "" }

还有这个

val text = mutableStateOf("")

3 个答案:

答案 0 :(得分:14)

remember 是一个可组合的函数,可用于缓存昂贵的操作。您可以将其视为可组合对象本地的缓存。

val state: Int = remember { 1 }

上面代码中的 state 是不可变的。如果您想更改该状态并更新 UI,您可以使用 MutableStateCompose 观察对 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 是使用 LiveDataFlow 的替代方法。 Compose 默认情况下不会观察到此对象的任何更改,因此不会发生重组。如果您希望观察更改并缓存状态,请使用 remember。如果不需要缓存而只想观察,可以使用derivedStateOf。这是如何使用它的sample

答案 1 :(得分:1)

基本上,在第一个示例中,您存储的是可变值,而在第二个示例中,您存储的是不可变值。

根据文档:“在缓存昂贵的 UI 操作(例如计算文本格式)时,您可以存储不可变值。记住的值与称为记住的可组合存储在组合中。” Source

有关 mutableStateOf 的更多信息,请参阅文档 link。当您希望在您的值发生变化时重新组合您的 UI 时,您可以使用它。

答案 2 :(得分:1)

remember 关键字可以存储可变或不可变对象。如果您传递 mutableStateOf 来记住,只要该对象的值发生变化,它就会强制重新组合正在读取该值的可组合项。