通常,组合代码类似
@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
将如何Save
和Restore
数据,我认为当您导航回该屏幕时,它将恢复数据。当您调试Saver
实现时,您还会注意到restoration
在重新组合期间被调用。我不太确定
免责声明:我最近刚刚学习作曲,仍在深入了解Snapshot
系统,你似乎正朝着和我一样的方向前进。如果你对Snapshot
系统感兴趣,我建议你偶尔访问一下这个链接。也很抱歉,由于缺乏声誉,我还不能发表评论,所以我只是发布了我对State
和composition
如何协同工作的想法和目前的理解。