kotlin 如何分开使用remember & mutableStateOf?

ego6inou  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(857)

通常,编写代码类似于

@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的复杂语法,希望对追随者有所帮助。

g6ll5ycj

g6ll5ycj1#

然后,我读了一些编写代码,并感到困惑,因为我没有找到记住订阅可变状态的位置。
据我所知,remember只在第一次composition或第一次执行@composable函数时计算和缓存它的lambda中的内容,这是@composable记住或订阅的唯一内容。它将触发re-calculation成为remembered
是否有方法使compose工作变为可变状态?
您的意思是指当State对象被更改时会自动触发的一些不可组合的代码或函数吗?
据我所知,compose States是专门设计用来与底层Snapshot系统一起工作的,触发composition机制的核心就发生在这里,我无法想象(到目前为止)在composition或Snapshot系统之外使用State对象。
在第二种情况下,当我点击文本时,它会++,但如果我转到一个新页面并返回,所有更改都会丢失,但在第一种情况下不会。
至于使用rememberSaveable,我会小心使用它,它可能看起来和remember一样,只是多了saving/restoration的一个幂,但是它有更多的幂,同时赋予它同等的责任,这一点在使用它时必须考虑到。我没有使用或定义rememberSaveable对象,而没有在其中显式定义Saver。所以我只能假设你的情况

rememberSaveable { mutableStateOf(1) }

composable观察rememberSaveablerememberSaveable还观察实际为changes的实际对象,并隐式保存和恢复具有最新值的该对象
而在这个时候,我想

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系统感兴趣,我建议你偶尔访问一下link。也很抱歉,我还不能发表评论,由于缺乏声誉,所以我只是张贴我的想法和目前的理解如何Statecomposition一起工作。

相关问题