请先查看下面的代码

class WellnessViewModel : ViewModel() {

    private val _tasks = getWellnessTasks().toMutableStateList()
    val tasks: List<WellnessTask>
        get() = _tasks

现在,我将任务传递给ComposeFunction,并且_TASKS中的任何更改(添加或删除项)都会导致ComposeFunction重新组合.但这到底是如何工作的,因为我为该函数提供了非状态对象,这是下面的代码.

@Composable
fun WellnessScreen(
    modifier: Modifier = Modifier,
    wellnessViewModel: WellnessViewModel = viewModel()
) {
    Column(
        modifier = modifier
    ) {
        StatefulCounter()
        WellnessTasksList(
            list = wellnessViewModel.tasks,
            onCloseTask = {
                wellnessViewModel.remove(it)
            },
            onCheckedTask = { task, checked ->
                wellnessViewModel.changeTaskChecked(task, checked)
            }
        )
    }
}

为什么这样做是有效的,如何做到这一点,需要一个简单的解释.

推荐答案

但这东西到底是怎么工作的,因为我提供了非 在下面代码中将对象声明为该函数

因为SnapshotStateList正好是StateObject,所以添加、删除或更新具有新实例的项会触发重组.

@Stable
class SnapshotStateList<T> : MutableList<T>, StateObject 

_tasks = getWellnessTasks().toMutableStateList()SnapshotStateList.如果希望更改属性,对该列表的任何修改都需要设置新的项,因为它是StateObject,因此会触发重新组合.T SnapshotStateList就是这样,它会触发已更改项的重新组合.您可以将其视为muableStateOf(List),但使用 Select 性重新组合,而不是传递一个重新组合每一项的新列表.

此外,当lambda不稳定时,调用它会导致重新组合.

Why does a composable recompose while seemingly being stateless (the only passed parameter is a function, not a state)

此外,您还可以查看如何使用SnapshotStateList、不稳定的lambdas和传递稳定的输入来优化重构,而不是传递不稳定的列表.

Jetpack Compose lazy column all items recomposes when a single item update

Android相关问答推荐

如何将Hilt添加到Android Studio中的Kotlin项目中?

在Android上使用XSLT文件转换XML文件

更改Jetpack Compose中选定的选项卡底线 colored颜色

Android Jetpack Compose调用view-model函数仅一次

当按下通知时,将Android应用程序置于前台

Jetpack Compose:根据盒子中的最大视图固定宽度和高度

如何在喷气背包中绕过集装箱

android回收器查看点击事件无响应

在 Compose 中,当用户持续向下滚动时,LazyColumn 不会显示新项目

expo 上的 socket.io 无法从 Android 连接

为什么第二个代码可以安全地在 map 中进行网络调用,因为它已被缓存?

Android WebView 不会在滚动端加载新内容

如何在ExecutorService中设置progressBar的进度?不想使用 AsyncTask,因为它已被弃用

如何在Android中使用嵌套的Recyclerview

在 MVVM Jetpack Compose 上添加依赖项时出现重复类错误

如何从包装在泛型中的 retrofit 调用中检索密钥?

用作输入参数的 Lambda 函数导致重组

Jetpack compose 为网络检索视频帧导致延迟

无法 HEAD 'https://jcenter.bintray.com/com/facebook/react/react-native/maven-metadata.xml'

在 Room 中创建一对多关系时,@Relation 类是什么意思?