android - Jetpack-Android 仅当对象的某个属性发生变化时如何触发重组

标签 android kotlin android-jetpack-compose compose-recomposition

想象一下下面的物体

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. 使用 clone 方法或接受其自己的类的实例作为参数的构造函数来创建我的对象的相同副本,该副本仍然表示我可以修改的新实例然后作为可变状态值传递。听起来比以前的 optoin 更容易,但优雅是不同的东西

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

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

最佳答案

我会考虑两种选择:

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

关于android - Jetpack-Android 仅当对象的某个属性发生变化时如何触发重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70863835/

相关文章:

android - Jetpack Compose LazyColumnFor 已弃用,如何将 LazyColumn 与 listState 和对象列表一起使用?

java - 我可以覆盖 Android 上的自动超时吗?

kotlin - 泛型参数化变量/常量的语法

java - JSONRequest 成功后 Android 更新 View

android-jetpack-compose - Jetpack compose Switch() Track Width、Track StrokeWidth、Thumb Diameter

android - 使用 paging 3 和 Jetpack compose UI 无限循环加载项目

javascript - 带有 javascript 的 HTML 未在 android webview 中加载

android - 我网站在 android webview 中的 Facebook 聊天按钮未打开 Messenger 应用程序

android - 为 Android 构建 Rsync

java - 如何从另一个类为 TextView 设置文本?