通常,编写代码类似于
@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
)
}
在第二种情况下,当我点击文本时,它会++,但如果我转到一个新页面并返回,所有更改都会丢失,但在第一种情况下不会。
然后,我读了一些编写代码,并感到困惑,因为我没有找到记住订阅可变状态的位置。
是否有方法使compose工作变为可变状态?
除此之外,我是否可以在我的gradle build目录下或其他任何地方找到compose生成的代码(除了dex,那太难读了)?Compose确实做得很好,但我不能读真正运行的代码,这使得大一新生更难开始。
2022年6月15日更新
现在我找到了一个合适的解决方案,使用viewmodel代替state保持器,在viewmodel中使用mutableState,在view可组合部分使用subscribe state,这样就可以避免使用livedata时viewmodel的复杂语法,希望对追随者有所帮助。
1条答案
按热度按时间g6ll5ycj1#
然后,我读了一些编写代码,并感到困惑,因为我没有找到记住订阅可变状态的位置。
据我所知,
remember
只在第一次composition
或第一次执行@composable
函数时计算和缓存它的lambda
中的内容,这是@composable
记住或订阅的唯一内容。它将触发re-calculation
成为remembered
是否有方法使compose工作变为可变状态?
您的意思是指当
State
对象被更改时会自动触发的一些不可组合的代码或函数吗?据我所知,compose
States
是专门设计用来与底层Snapshot
系统一起工作的,触发composition
机制的核心就发生在这里,我无法想象(到目前为止)在composition或Snapshot
系统之外使用State
对象。在第二种情况下,当我点击文本时,它会++,但如果我转到一个新页面并返回,所有更改都会丢失,但在第一种情况下不会。
至于使用
rememberSaveable
,我会小心使用它,它可能看起来和remember
一样,只是多了saving/restoration
的一个幂,但是它有更多的幂,同时赋予它同等的责任,这一点在使用它时必须考虑到。我没有使用或定义rememberSaveable
对象,而没有在其中显式定义Saver
。所以我只能假设你的情况composable
观察rememberSaveable
,rememberSaveable
还观察实际为changes
的实际对象,并隐式保存和恢复具有最新值的该对象而在这个时候,我想
rememberSaveable
保存val data: MutableState<String>
的状态(空的),而composable
观察到mutableState
的一个示例正在更改,不幸的是,rememberSaveable
已经保存了一个初始状态,就像rememberSaveable { data: MutableState<String> }
,而不是实际更改的mutableStateOf("hello")
,所以当你返回时,它会以这种方式恢复它。我很好奇,你可以尝试用一个包含
Saver
的伴随对象来实现你的MyState类,在这个对象中你可以定义rememberSaveable
将如何Save
和Restore
数据,我想当你导航回那个屏幕时,它会恢复它。当你调试Saver
实现时,您还将注意到在重新组合期间调用了restoration
。免责声明:我最近刚刚学习作曲,还在深入研究
Snapshot
系统,看起来你和我的方向是一样的。如果你对Snapshot
系统感兴趣,我建议你偶尔访问一下link。也很抱歉,我还不能发表评论,由于缺乏声誉,所以我只是张贴我的想法和目前的理解如何State
和composition
一起工作。