相关疑难解决方法(0)

Android Jetpack Compose mutableStateListOf 不进行重组

所以,我有mutableStateListOf一个viewModel

var childTravellersList = mutableStateListOf<TravellersDetails>()
Run Code Online (Sandbox Code Playgroud)

TravellersDetails是一个数据类,有一个名为 的字段error

childTravellersList在 UI 中使用为:

val list = remember{viewModel.childTravellersList}

LazyColumn(state = lazyColumnState) {
    itemsIndexed(list) { index, item ->
        SomeBox(show = if(item.error) true else false)
    }
  }
Run Code Online (Sandbox Code Playgroud)

我在给定的TravellersDetailsviewModel更新中编写了一个函数:errorindexchildTravellersList

fun update(index){
    childTravellersList[index].error = true
}
Run Code Online (Sandbox Code Playgroud)

因此,每当我调用此函数时,列表都应该更新。

这会更新列表,但不会触发 UI 重组。我哪里做错了?

android kotlin android-jetpack android-jetpack-compose

29
推荐指数
1
解决办法
3万
查看次数

MutableStateFlow 强制更新/通知收集器

MutableStateFlow如果更新值等于旧值(源),则不会通知收集器。我找到了解决此问题的方法,但对于复杂值来说它不能很好地扩展。

解决方法:使用/重复数据类copy()和列表。toList()toMutableList()

WorkoutRoutine示例 1:使用解决方法重命名的简单数据类name。这里没什么问题。

data class WorkoutRoutine(
    var name: String,
)

val workoutRoutine = MutableStateFlow(WorkoutRoutine("Initial"))
                                                                                           
workoutRoutine.value.name = "Updated" // Doesn't notify collectors
                                                                                           
workoutRoutine.value = workoutRoutine.value.copy(name = "Updated") // Workaround: works

Run Code Online (Sandbox Code Playgroud)

示例 2:WorkoutRoutine具有多个依赖项的复杂数据类,使用解决方法将 a 添加SetExercisein 中WorkoutRoutine:这需要大量的copy()andtoMutableList()调用,这使得代码不可读。

data class WorkoutRoutine(
    var name: String,
    var exercises: MutableList<Exercise> = mutableListOf(Exercise())
)
                                                                         
data class Exercise(
    var sets: MutableList<Set> = mutableListOf(Set())
)
                                                                         
data …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-coroutines kotlin-flow

10
推荐指数
1
解决办法
1万
查看次数