想象一下下面的物体
data class CourseState(
val key:Int=0,
val name:String="",
val courses:Courses=Courses())
实现以下模式
private val _courseState = mutableStateOf(CourseState())
val courseState: State<CourseState> = _courseState
我可以通过调用以下命令来触发 UI 的重构:
_courseState.value = CourseState()
但不是通过调用:
_courseState.value.courses.addCourse(Course("some course))
这有点令人沮丧,因为即使该对象明显发生了变化,我也被迫创建父对象的一个全新实例,以便引发其中的微小变化。
现在,我知道 Compose 在幕后使用的是.equals()
方法以确定是否应该重构布局,因此我对如何实现所需的行为有一些想法。
-
覆盖equals
方法:这将意味着一些样板代码,并且必须对构成我的对象的整个嵌套类集完成。这可能有效,但看起来危险且麻烦。
-
use a clone
方法或构造函数,它接受自己类的实例作为参数来创建对象的相同副本,该副本仍然代表我可以修改的新实例,然后作为可变状态值传递。听起来比之前的选择更容易,但优雅是不同的
-
深入研究 State 和 MutableState 类,看看是否有办法让它们按照我想要的方式运行。我依赖你们中的一些人以前做过这件事,所以我不必 XD
让我知道您的想法,或者是否还有其他一些我到目前为止还没有想到的明显解决方案
我会考虑两种选择:
- 正如您所提到的,为每次更改创建对象的新实例。具有数据类和
copy
,这很容易,但会增加一些开销。
- 使您需要更改的所有数据都可观察。如果您只想从撰写中观察它们,请使其
State
,否则你可以使用Flow
or LiveData
。我想你的Courses
类包含一些List
到哪个
您正在添加项目。使其成为可变状态列表() https://developer.android.com/reference/kotlin/androidx/compose/runtime/package-summary#mutableStateListOf(),
每当你在那里添加一些东西时,使用它的可组合项应该
自动重新组合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)