kotlin 如果我不能使用可变Map的可变状态,但我必须能够改变Map,那么我怎么能看到Map状态的变化呢?

yftpprvb  于 2022-12-13  发布在  Kotlin
关注(0)|答案(2)|浏览(176)

Kotlin新来了!
我试图制作一个可以改变的Map,但这种改变也会触发重新组合。然而,我遇到了一个难题,似乎找不到一个绕过它的方法。
我明白使用这样的东西:

val someVar by remember {mutableStateOf(someMutableMap)}

是无用的,因为它试图查看对象的可变状态,而对象本身是可变的。我理解为什么这不起作用。但是,我似乎找不到使用mutableStateOf的方法(),因为如果使用普通Map,就无法添加键/值对,也无法更改值。因为这是不可变的意思。但是我需要能够添加和更改Map,因为我正在编写的应用程序的性质。
我试过了:

  • 〉使用一个mutableStateOf(mutableMap),它会警告我在本身可变的东西上使用可变状态。
  • 〉使用一个mutableStateOf(map),它确实会触发重组,但是,它也会阻止我添加或更改map,因为没有任何用于不可变对象的setter。这会导致构建map的函数(从文本文件,但每次都有一个令人头痛的问题)无法工作,沿着应用程序的其他基本内容,因为所有的重点都是让用户构建这个map。
    我不期待一个银盘的答案,但一个小方向将不胜感激。我可以在这里张贴代码,如果它会有所帮助。
i86rm4rw

i86rm4rw1#

对只读Map执行此操作的方法是创建新的只读Map。您可以使用加号和减号操作符来完成此操作。您可以使用+=-=以方便使用。这些操作将创建新的只读Map,并对原始Map进行指定的修改。

val someVar by remember { mutableStateOf(mapOf("key" to 1) }

// To add something, use + and a Pair:
someVar = someVar + "some other key" to 2
// or:
someVar += "some other key" to 2

// To remove something, use - and the key to remove
someVar = someVar - "key"
// or:
someVar -= "key"

文档中有更多详细信息。您也可以添加键对或Map列表来添加一组键。或者您也可以删除键列表。

cwxwcias

cwxwcias2#

您可以使用mutableStateMapOf来获取SnapshotStateMap,当您使用新示例添加、删除或更新现有项时,它会触发重新组合

val map: SnapshotStateMap<Int, String> = remember {
    mutableStateMapOf()
}

取样器

@Composable
private fun MutableStateMapOfSample() {
    val map: SnapshotStateMap<Int, String> = remember {
        mutableStateMapOf()
    }

    var counter by remember {
        mutableStateOf(0)
    }

    Button(onClick = {
        map[counter] = "Value: $counter"
        counter++
    }) {
        Text("Add $counter")
    }
    
    LazyColumn(){
        items(items= map.keys.toList()) {
            Text("key: $it, value: ${map[it]}")
        }
    }
}

还有List变体SnapshotStateListmutableStateListOf,它只为更新的项目触发重组。
Jetpack Compose惰性列在单个项更新时重新组合所有项

相关问题