想象一下下面的物体
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
方法:这意味着一些样板代码,并且必须对构成我的对象的整个嵌套类集完成。这可能有效,但看起来很危险且麻烦。使用
clone
方法或接受其自己的类的实例作为参数的构造函数来创建我的对象的相同副本,该副本仍然表示我可以修改的新实例然后作为可变状态值传递。听起来比以前的 optoin 更容易,但优雅是不同的东西深入研究 State 和 MutableState 类,看看是否有办法让它们按我想要的方式运行。我依靠你们中的一些人以前做过这件事,所以我不必 XD
让我知道您的想法,或者是否还有其他一些我目前还没有想到的明显解决方案
最佳答案
我会考虑两种选择:
- 如您所述,为每次更改创建对象的新实例。使用数据类和
复制
,这很容易,但会增加一些开销。 - 使您需要更改的所有数据都可观察到。如果你只想从compose中观察它们,就把它设为
State
,否则你可以使用Flow
或LiveData
。我想你的Courses
类包含一些List
您正在添加项目。使它成为 mutableStateListOf() , 每当你在那里添加东西时,使用它的可组合项应该 自动重组。
关于android - Jetpack-Android 仅当对象的某个属性发生变化时如何触发重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70863835/