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

@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相关问答推荐

将Any强制转换为Integer将从API返回NullPointerException

Yarn 机器人导致活动未找到,但Gradlew Run工作正常

无法使用MenuItemColors.Copy()

Android Compose Pages 3-一次加载所有页面,无需在LazyColumn中滚动,无需网络调用和内部滚动

默认调度程序是否在协程中使用共享线程池?

如何在Android中将以前的数据保存在复选框中?

jetpackcompose-如何对解析后的复杂对象进行状态提升?

如何将DrawableId参数传递给XML布局?

在 kotlin 中动态添加 GridView

安卓模拟器打不开

在 Kotlin 中设置 startActivity() 时类型不匹配

组成不重叠的元素

如何在 compose 中使用 BottomSheetScaffold 为底页设置半展开高度?

在 Jetpack Compose 中 Select 要省略的文本

react-native-config 在发布版本中不起作用

如果我在网络请求中指定它们是否与判断网络功能相关

我的自定义视图没有显示我应该如何修复它?

如何使伴奏导航 BottomSheet 完全展开?

在delphi中将Jnet_uri转换为Tbitmap

Xamarin 获取动态 ListView DataTemplate 中的按钮单击事件数据