Jetpack Compose: использование размера списка в качестве ключа для запоминания не работает должным образомAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Jetpack Compose: использование размера списка в качестве ключа для запоминания не работает должным образом

Сообщение Anonymous »

У меня есть класс Person с изменяемым списком адресов электронной почты.
В следующем Composable список отображается, и я хочу разрешить добавление новых и удаление существующих адресов электронной почты. >
Уменьшенный до минимума Composable выглядит следующим образом:

Код: Выделить всё

@Composable
fun EmailList(p: Person) {
var emails = remember(p.emails.size) { mutableStateListOf(*p.emails.toTypedArray()) }
Row() {
Button(onClick = { p.emails.add(Email()) }) { Text("add") }
Button(onClick = { p.emails.removeAt(0) }) { Text("delete") }
}
emails.forEach { email ->
Text(email.toString())
}
}
Передавая ключ p.emails.size функции Remember, я ожидал, что локальный список адресов электронной почты будет пересчитываться, когда новая запись списка будет добавлена ​​в p.emails или удалена из него.Но нажатие кнопки добавления или удаления не приводит к перекомпозиции. Список не будет обновляться.
Единственный способ — добавить/удалить новый элемент в локальном списке:

Код: Выделить всё

@Composable
fun EmailList(p: Person) {
var emails = remember(p.emails.size) { mutableStateListOf(*p.emails.toTypedArray()) }
Row() {
Button(onClick = { Email().also{p.emails.add(it);emails.add(it) }}) { Text("add") }
Button(onClick = { p.emails.removeAt(0); emails.removeAt(0) }) { Text("delete") }
}
emails.forEach { email ->
Text(email.toString())
}
}
Но я не понимаю, зачем это нужно.
Более того, когда я просматриваю разные объекты людей, список адресов электронной почты обновляется если у предыдущего человека другое количество адресов электронной почты, и оно остается неизменным (что, конечно, нежелательно, а является лишь проблемой в моем минимизированном примере), если количество электронных писем одинаково для текущего и предыдущего объекта людей.Похоже, что ключ p.list.size имеет эффект, если входящий объект person изменяется, но это не имеет никакого эффекта, если изменяется только размер списка.
Я знаю, что могу определить список в своем классе Person как MutableStateList. Но похоже, что я путаю бизнес-логику с особенностями пользовательского интерфейса.

Подробнее здесь: https://stackoverflow.com/questions/792 ... s-expected
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»