You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose动态UI重组时丢失数据的问题求助

Kotlin Jetpack Compose动态UI与ObjectBox存储问题

我正在使用Kotlin和Jetpack Compose开发动态UI,数据存储于ObjectBox数据库。需求是实现一个初始含1个空项的可组合文本框,当文本框内容填写完成后,点击红色“+”按钮可新增文本框,所有值可随时编辑直至最终存储。

目前按钮状态正常,可添加/删除行,但存在两个问题:

  • 滚动过该可组合项后,UI重置为初始状态
  • 日志显示HashMap仍有旧值,但UI未展示,再次输入会导致重复键错误

状态定义代码

val textFields = remember { getDataStringToMap(data.dataItem.dataValue) }
val number = remember { mutableStateOf(textFields.size) }

数据转换方法

private fun getDataMapToString(textFieldsMap: HashMap<Int, String>): String {
    val gson = Gson()
    val newMap = hashMapOf<Int, String>()
    for (value in textFieldsMap){
        if (value.value .isNotBlank()){
            newMap[value.key] = value.value
        }
    }
    return gson.toJson(newMap)
}
private fun getDataStringToMap(textsFieldsString: String): HashMap<Int, String> {
    val gson = Gson()
    return if (textsFieldsString.isBlank()) {
        hashMapOf<Int, String>(0 to "")
    } else {
        val mapType = HashMap<Int, String>().javaClass
        gson.fromJson(textsFieldsString, mapType)
    }
}

文本框可组合项调用代码

items(number.value) { index ->
    listItem(
        itemValue = textFields[index].orEmpty(),
        changeValue = {
            textFields[index] = it
            setDataValue(getDataMapToString(textFields))
        },
        addItem = {
            columnHeight.value += itemHeight
            scope.launch {
                scrollState.animateScrollBy(itemHeight)
            }
        },
        deleteItem = {
            columnHeight.value -= itemHeight
            scope.launch {
                scrollState.animateScrollBy(-itemHeight)
            }
        },
        lastItem = index == number.value - 1,
        index = index
    )
}

2022年12月30日更新:改用rememberSaveable解决了滚动和重组时UI状态重置的问题,但现在需要处理元素显示与删除的逻辑问题。

内容的提问来源于stack exchange,提问作者J_Orotayo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:15:27