仅对象属性更改时如何触发重组 Jetpack-Android

2023-12-25

想象一下下面的物体

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()方法以确定是否应该重构布局,因此我对如何实现所需的行为有一些想法。

  1. 覆盖equals方法:这将意味着一些样板代码,并且必须对构成我的对象的整个嵌套类集完成。这可能有效,但看起来危险且麻烦。

  2. use a clone方法或构造函数,它接受自己类的实例作为参数来创建对象的相同副本,该副本仍然代表我可以修改的新实例,然后作为可变状态值传递。听起来比之前的选择更容易,但优雅是不同的

  3. 深入研究 State 和 MutableState 类,看看是否有办法让它们按照我想要的方式运行。我依赖你们中的一些人以前做过这件事,所以我不必 XD

让我知道您的想法,或者是否还有其他一些我到目前为止还没有想到的明显解决方案


我会考虑两种选择:

  1. 正如您所提到的,为每次更改创建对象的新实例。具有数据类和copy,这很容易,但会增加一些开销。
  2. 使您需要更改的所有数据都可观察。如果您只想从撰写中观察它们,请使其State,否则你可以使用Flow or LiveData。我想你的Courses类包含一些List到哪个 您正在添加项目。使其成为可变状态列表() https://developer.android.com/reference/kotlin/androidx/compose/runtime/package-summary#mutableStateListOf(), 每当你在那里添加一些东西时,使用它的可组合项应该 自动重新组合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅对象属性更改时如何触发重组 Jetpack-Android 的相关文章

随机推荐