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

JetPack Compose中如何用for循环初始化MutableStateMapOf变量?

使用Kotlin和Jetpack Compose通过循环初始化MutableStateMap的解决方案

问题场景

我用Kotlin和Jetpack Compose开发应用,作为新手遇到个问题:想创建一个StateMap跟踪多个Composable的状态,知道要用remember防止重组丢失状态,手动初始化MutableStateMap是没问题的:

val expandedStates = remember {
    mutableStateMapOf(
        "category1" to false, 
        "category2" to false,
        "category3" to false, 
        "category4" to false, 
        "category5" to false,
    )
}

但想用for循环代替逐个写键值对,试了下面的写法却不行:

val categories = listOf( "cat1", "cat2", "cat3", "cat4", "cat5")

val expandedStates = remember {
    mutableStateMapOf(
        for (cat in categories){
          return Pair(cat, false)
        }
    )
}

想问怎么实现?要不要重写MutableStateMap的构造函数?

解决方案

不用重写构造函数,有几种简单的方式可以实现:

方式一:集合转换快速生成

先通过associateWith把列表转成键值对集合,再直接转成MutableStateMap,写法简洁高效:

val categories = listOf("cat1", "cat2", "cat3", "cat4", "cat5")

val expandedStates = remember {
    categories.associateWith { false }.toMutableStateMap()
}

也可以先创建空的StateMap,再用putAll批量添加键值对:

val expandedStates = remember {
    mutableStateMapOf<String, Boolean>().apply {
        putAll(categories.associateWith { false })
    }
}

方式二:循环逐个添加

如果更习惯循环逻辑,先初始化空的MutableStateMap,再通过forEach循环逐个赋值:

val categories = listOf("cat1", "cat2", "cat3", "cat4", "cat5")

val expandedStates = remember {
    mutableStateMapOf<String, Boolean>().apply {
        categories.forEach { cat ->
            this[cat] = false
        }
    }
}

为什么之前的写法不生效?

mutableStateMapOf()函数接收的是Pair类型的可变参数,不能直接传入for循环代码块——你的写法无法生成它需要的参数格式,所以编译不通过,完全没必要去重写构造函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:57:38