Jetpack Compose使用rememberSaveable存储TextFieldValue报错如何解决?
错误原因
TextFieldValue 不属于Android Bundle支持的默认可序列化类型,rememberSaveable 默认无法直接存储该类型的状态,因此抛出该异常。
解决方案
方案一:改用String类型存储状态(推荐,适配绝大多数场景)
如果不需要保留光标位置、文本选中范围等额外输入状态,直接将状态改为String类型即可,同时可以补充校验规则确保仅输入10位数字:
// 替换原有rememberSaveable代码 var query by rememberSaveable { mutableStateOf("") } val maxChar = 10 TextField( // 替换value绑定 value = query, onValueChange = { // 同时校验长度和输入内容是否为纯数字 if (it.length <= maxChar && it.all { char -> char.isDigit() }) { query = it } }, // 剩余label、keyboardOptions、样式等配置保持原有代码不变 )
仅设置keyboardType = KeyboardType.Number无法完全阻止非数字输入,额外增加it.all { char -> char.isDigit() }校验可以保证输入内容完全符合要求。
方案二:自定义Saver保存TextFieldValue(需要保留完整输入状态的场景)
如果确实需要保留光标位置、文本选中状态等TextFieldValue的完整信息,可以自定义Saver将其转换为可序列化的类型存储:
- 首先定义TextFieldValue的专属Saver:
val TextFieldValueSaver = Saver<TextFieldValue, String>( save = { state -> state.text }, restore = { savedText -> TextFieldValue(savedText) } )
如果需要同时保存选中范围等信息,可以将Saver的存储类型改为Map<String, Int>,分别存储文本、选中文本起始、结束位置等参数。
2. 修改rememberSaveable代码,传入自定义Saver:
var query by rememberSaveable(stateSaver = TextFieldValueSaver) { mutableStateOf(TextFieldValue("")) }
原有TextField的其余配置不需要做任何改动。
内容的提问来源于stack exchange,提问作者Sparsh Dutta
相关产品推荐
相关产品推荐

