如何单独使用remember&mutableStateof?



通常,组合代码类似

@Preview
@Composable
fun BuildMyView() {
val counter = rememberSaveable { mutableStateOf(1) }
Text(
modifier = Modifier
.fillMaxSize()
.wrapContentSize(align = Alignment.Center)
.clickable { counter.value++ },// click and text will ++
text = "${counter.value}"
)
}

最近,我想把所有的视图数据收集在一起,建立一个状态并创建类似的东西:

data class MyState(
val data: MutableState<String>
)
val stateTemp = MyState(mutableStateOf("hello"))
@Preview
@Composable
fun BuildMyView() {
val counter = rememberSaveable { stateTemp.data}
Text(
modifier = Modifier
.fillMaxSize()
.wrapContentSize(align = Alignment.Center)
.clickable { stateTemp.data.value += "-1" },
text = counter.value
)
}

在第二种情况下,当我点击文本时,它会++,但如果我转到一个新页面并返回,所有更改都将丢失,而在第一种情况下则不会。

然后,我读了一些编写代码,并感到困惑,因为我没有找到在哪里记住订阅可变状态。

有没有一种方法可以使撰写工作变为可变状态?

此外,我能在我的gradle构建目录下找到compose生成的代码吗?还是在其他任何地方(除了dex,这太难阅读了)?Compose确实做得很出色,但我读不懂真正的代码,这让大一新生更难上手。

2022年6月15日更新

现在我找到了一个合适的解决方案,使用视图模型而不是状态持有者,在视图模型中使用可变状态,在视图可组合部分中使用订阅状态,这样我就可以避免使用livedata的视图模型的复杂语法。希望这将帮助追随者。

然后我读了一些编写代码,并感到困惑,因为我没有找到记住在哪里订阅可变状态。

据我所知,remember仅在第一次composition或第一次执行@composable函数期间计算并缓存其lambda内部的内容,这是@composable唯一记得或订阅的内容。除非您向remember提供key,否则当它更改时,它将触发re-calculation成为remembered

有没有一种方法可以使撰写工作的可变状态?

您是指当State对象更改时将自动触发的某段不可组合的代码或函数吗?如果这就是你的意思,我想你只需要回到好的旧的可观察模式

据我所知,composeStates是专门为与底层Snapshot系统协同工作而设计的,在该系统中,触发composition机制的核心发生了,我无法想象(到目前为止)在compose之外或在Snapshot系统之外使用State对象。

在第二种情况下,当我点击文本时,它会++,但如果我转到一个新页面并返回,所有更改都将丢失,而在第一种情况下则不会。

至于使用rememberSaveable,我会小心使用它,它可能看起来和remember一样,只是增加了saving/restoration的功能,但它有更大的功能和同等的责任,你在使用它时必须考虑到这一点。我没有使用或定义过rememberSaveable对象,而没有在其中明确定义Saver,所以我只能在你的情况下假设

rememberSaveable { mutableStateOf(1) }

CCD_ 21观察CCD_ 22,该CCD_

在这个过程中,我认为

data class MyState(
val data: MutableState<String>
)
val stateTemp = MyState(mutableStateOf("hello"))
...
...
rememberSaveable { stateTemp.data}

rememberSaveable保存val data: MutableState<String>的状态(它是空的),而composable观察到mutableState的一个正在更改的实例,不幸的是,rememberSaveable已经以类似rememberSaveable { data: MutableState<String> }的方式保存了初始状态,而不是实际更改的mutableStateOf("hello"),所以当您返回时,它将以这种方式恢复它。

我很好奇,您可以尝试用一个包含Saver的伴随对象来实现MyState类,在这里您可以定义rememberSaveable将如何SaveRestore数据,我认为当您导航回该屏幕时,它将恢复数据。当您调试Saver实现时,您还会注意到restoration在重新组合期间被调用。我不太确定

免责声明:我最近刚刚学习作曲,仍在深入了解Snapshot系统,你似乎正朝着和我一样的方向前进。如果你对Snapshot系统感兴趣,我建议你偶尔访问一下这个链接。也很抱歉,由于缺乏声誉,我还不能发表评论,所以我只是发布了我对Statecomposition如何协同工作的想法和目前的理解。

最新更新