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
相关产品推荐
相关产品推荐

