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

Kotlin mutableStateOf持有String状态时出现委托错误

问题解决:枚举转字符串数组在rememberSaveable中报错

问题根源

报错Type 'TypeVariable(T)' has no method 'getValue(Nothing?, KProperty<*>)'的核心是类型推断模糊:

  • 调用mutableStateOf(exerciseTypeValues[0])时,编译器无法精准确定泛型T的具体类型(枚举转换后的数组类型推导存在歧义),导致委托对象不符合by委托的类型要求。
  • 对比资源文件示例,stringArrayResource返回的是明确的Array<String>,编译器能直接识别类型,因此不会触发报错。

解决方案

1. 显式指定mutableStateOf泛型类型

在创建状态时明确声明<String>泛型,消除类型推断歧义:

val exerciseTypeValues = getExerciseTypesAsStrings().toTypedArray()
var exerciseType by rememberSaveable { mutableStateOf<String>(exerciseTypeValues[0]) }

2. 适配ExerciseTypeInput的参数类型

ExerciseTypeInput接收ArrayList<String>,但toTypedArray()返回的是Array<String>,需要转换为ArrayList:

ExerciseTypeInput(
    values = ArrayList(exerciseTypeValues.asList()),
    modifier = Modifier,
    updateExerciseType = { selected ->
        exerciseType = selected
    }
)

3. 优化枚举转字符串逻辑(可选)

直接在枚举类中提供字符串数组,减少额外转换步骤:

enum class ExerciseType(val exercise: String) {
    CHEST("Chest"),
    LEG("Leg"),
    ARMS("Arms"),
    CORE("Core"),
    LOWER_BODY("Lower Body"),
    UPPER_BODY("Upper Body");

    companion object {
        val stringValues = values().map { it.exercise }.toTypedArray()
    }
}

// 使用时直接调用
val exerciseTypeValues = ExerciseType.stringValues

验证效果

修改后,rememberSaveable能正确识别状态类型,委托机制正常工作,下拉菜单选择值后可正确更新并持久化状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:42:29