如何在Jetpack Compose中将MutableState<String>转换为Int?
问题解决:NumberFormatException 转换MutableState到Int失败
错误根源
你遇到的问题是因为存入savedStateHandle的不是数字字符串,而是MutableState对象本身。当你读取时拿到的是该对象的toString()结果(比如"MutableState(value=1)@196947123"),用这个字符串转Int自然会抛出格式异常。
解决方案
1. 从根源修正:存入正确的数据类型
在第二个页面往savedStateHandle存数据时,确保存入的是实际的数值(Int)或数字字符串,而不是MutableState对象:
- 直接存Int(推荐,避免类型转换):
// 第二个页面存数据的代码 navHostController.previousBackStackEntry?.savedStateHandle?.set("selectedPosition", 1) - 存数字字符串:
navHostController.previousBackStackEntry?.savedStateHandle?.set("selectedPosition", "1")
2. 修正读取代码
若存入的是Int类型
直接读取Int类型的LiveData,无需手动转换:
val secondScreenResult = navHostController.currentBackStackEntry ?.savedStateHandle ?.getLiveData<Int>("selectedPosition")?.observeAsState() secondScreenResult?.value?.let { pos -> // pos已经是Int类型,直接使用 }
若存入的是数字字符串
保持原读取逻辑即可,此时拿到的it是纯数字字符串,转Int不会报错:
val secondScreenResult = navHostController.currentBackStackEntry ?.savedStateHandle ?.getLiveData<String>("selectedPosition")?.observeAsState() secondScreenResult?.value?.let { val pos = it.toInt() // 此时it是"1",转换成功 }
3. 临时补救方案(不推荐)
如果暂时无法修改存数据的逻辑,可以通过正则表达式从错误的字符串中提取数值,但这种方法依赖MutableState的toString()格式,后续版本可能失效:
secondScreenResult?.value?.let { val regex = Regex("value=(\\d+)") val matchResult = regex.find(it) matchResult?.groupValues?.get(1)?.toInt()?.let { pos -> // 使用提取出的pos } }
内容的提问来源于stack exchange,提问作者Anshul Tyagi
相关产品推荐
相关产品推荐

