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

que*_*gre 7 android kotlin android-jetpack-compose compose-recomposition

想象一下下面的物体

data class CourseState(
val key:Int=0,
val name:String="",
val courses:Courses=Courses())
Run Code Online (Sandbox Code Playgroud)

实现以下模式

private val _courseState = mutableStateOf(CourseState())
val courseState: State<CourseState> = _courseState
Run Code Online (Sandbox Code Playgroud)

我可以通过调用以下命令来触发 UI 的重构:

_courseState.value = CourseState()
Run Code Online (Sandbox Code Playgroud)

但不是通过调用:

_courseState.value.courses.addCourse(Course("some course))
Run Code Online (Sandbox Code Playgroud)

这有点令人沮丧,因为即使该对象明显发生了变化,我也被迫创建父对象的一个​​全新实例,以便引发其中的微小变化。

现在,我知道 Compose 在幕后使用该.equals()方法来确定是否应该重新组合布局,因此我对如何实现所需的行为有了一些想法。

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

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

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

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

Jan*_*ína 5

我会考虑两种选择:

  1. 正如您所提到的,为每次更改创建对象的新实例。使用数据类 和copy,这很容易,但会增加一些开销。
  2. 使您需要更改的所有数据都可观察。如果您只想从 compose 中观察它们,请创建State,否则您可以使用FlowLiveData。我想您的Courses班级包含一些List您要添加项目的班级。使其成为 mutableStateListOf(),每当您在其中添加内容时,使用它的可组合项都应该自动重新组合。