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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:23:22