我有一个带有数据类的视图模型

@HiltViewModel
class MetricUnitViewModel @Inject constructor(): ViewModel() {
    val state = MutableStateFlow(SettingsState())

    fun onItemChecked(settingItem: SettingItemAction.Checkable.CheckableItem) {
        val newList = state.value.settingItems.map { item ->
            item.isChecked = item == settingItem
            item
        }
        state.value = state.value.copy(settingItems = newList)
       
    }

    data class SettingsState(
        val settingItems: List<SettingItemAction.Checkable.CheckableItem> = emptyList()
    )
}

和屏幕

@Composable
fun MetricUnitScreen(
    viewModel: MetricUnitViewModel = hiltViewModel(),
    settingsData: SettingsData,
    onItemChecked: (SettingItemAction.Checkable.CheckableItem) -> Unit,
    onBackClicked: () -> Unit = {},
) {
    val state by viewModel.state.collectAsState()
    state.settingItems.forEachIndexed { index,  item ->
            MetricUnitItemView(
                viewModel = viewModel,
                item = item,
                isLast = index == state.settingItems.lastIndex
            ) {
                onItemChecked(it)
            }
        }

但看起来是onItemChecked(),调用state.value = state.value.copy(settingItems = newList)对@Composable Screen没有任何影响.它完全被忽略,即使在视图模型端我可以看到修改的列表

推荐答案

onItemChecked函数中,通过映射现有项并更新与传递的settingItem参数匹配的项的isChecked属性,可以创建一个包含SettingItemAction.Checkable.CheckableItem个对象的新列表.但是,您不会更新settingItem参数本身的isChecked属性.

要解决此问题,您可以按如下方式修改onItemChecked函数:

fun onItemChecked(settingItem: SettingItemAction.Checkable.CheckableItem) {
    val newList = state.value.settingItems.map { item ->
        if (item == settingItem) {
            item.copy(isChecked = true)
        } else {
            item.copy(isChecked = false)
        }
    }
    state.value = state.value.copy(settingItems = newList)
}

Android相关问答推荐

如何允许我的应用程序在Android 10上运行,同时目标是API 33

在画布上画直线

derivedStateOf与使用key和MutableState记住

Android添加设置图标齿轮到应用程序信息

懒惰列的滚动到项目不按预期工作'

如何解决Android Studio中的in fragment问题

将Android Studio插件复制到离线网络

Jetpack编写错误(java.lang.NoSuchMethodError:无接口方法startRestartGroup)

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

可组合函数无限地从视图模型获取值

有没有办法迭代类型安全的项目访问器?

Android 导航 - 定义参数

Android:使用依赖项 ViewModelProviderFactory 初始化 ViewModel 的正确方法

使用 Kotlin 在 Android 中导航时如何防止 ViewModel 被杀死?

Android:appcompat 和 material 如何从默认创建 appcompat 和 material 视图?

在 Google Play 中将用户从开放测试转移到生产的过程是怎样的?

如何在 Dolphin 中启用 android studio new logcat | 2021.3.1 金丝雀 6?

jetpack compose 中的可点击指示是什么?

在 Compose 中使用 DeepLink 会导致无法向后导航

Android Java Keystore 在另一台机器上损坏