获取列表中每个 TextField 的值

Get values of every TextField in a List

我有一个列表,其中每个元素都包含两个 TextField。一个TextField是放key,一个放value。我想获取TextFields的值,例如List中的键TextField的值和其他List中的值TextField的值,或者获取键和值的值并将它们放在MutableMap中(更喜欢最后一个)但我不知道该怎么做。

我该怎么做?我正在使用 LazyColumn 来显示 TextField 列表。 现在,我只有两个变量,但所有 TextField 的值始终相同,我想为每个 TextField 设置不同的值。

      val keys = remember { mutableStateOf(TextFieldValue()) }
      val values = remember { mutableStateOf(TextFieldValue())}

      LazyColumn(Modifier.fillMaxWidth()){
                   itemsIndexed(myListOfTextFields) { index, item ->
                        Row(Modifier.fillMaxWidth()) {
                           TextField(value = keys.value,
                                     onValueChange = { keys.value = it },
                                     singleLine = true)
                            TextField(value = values.value,
                                      onValueChange = { values.value = it },
                                      singleLine = true)
                   }
      }

根据我的了解,您希望将 list 中的每个输入的“key/value”对存储在 KV 或和映射的数组中

Compose 为您提供了 mutableStateListOf 功能,允许您在组合范围内与可观察对象 MutableList 进行交互。

Compose 还为您提供 mutableStateMapOf 但在您的情况下,我建议您不要使用它,因为您无法轻松地将 key/value 映射到 index 在您的文本字段中 查看代码注释

这是我的推荐:

val data = remember { mutableStateListOf<Pair<String, String>>() }

LazyColumn(Modifier.fillMaxWidth()) {
    itemsIndexed(myListOfTextFields) { index, item ->
        val datum = data[index] // can't do this with mutableStateMapOf ??

        Row(Modifier.fillMaxWidth()) {
            TextField(
                value = datum.first,
                onValueChange = { data[index] = data[index].copy(first = it) },
                singleLine = true
            )
            TextField(
                value = datum.second,
                onValueChange = { data[index] = data[index].copy(second = it) },
                singleLine = true
            )
        }
    }
}

ListPair 组合成 MutableList<Pair<K, V>> 可以让您访问 kotlin 的库 MutableList<Pair<K, V>>.toMap()Iterable 变成 Map<K, V>

The returned map preserves the entry iteration order of the original collection. If any of two pairs would have the same key the last one gets added to the map.

由于您的交互依赖于迭代,因此我会强烈坚持使用列表并在稍后提交数据时将其转换为地图。

data.toMap()