Составное состояние теряется после прокрутки и поворота

у меня естьLazyColumnсодержащий ToggleButtonGroups, которые я создал сам. Моя проблема может быть воспроизведена с помощью этих трех шагов:

  1. Выберите «ДА» для каждой группы ToggleButtonGroup.

  1. Поверните экран, а затем прокрутите вниз

  1. Поверните экран назад. Теперь верхние три-четыре группы ToggleButtonGroups сбрасываются.

Проблема не появляется, если я не прокручиваю после вращения. Таким образом, только вращением состояние сохраняется правильно, как я и ожидал, используяrememberSaveable.

Код приведен ниже:

       LazyColumn() {

        items(characteristics) {characteristic: Characteristic ->

            ToggleButtonGroup(
                defaultIndex = 2,
                values = listOf(Pair("YES", -1), Pair("NO", 1), Pair("TBD", 0)),
                onToggleChange = { newValue: Int ->
                    characteristic.value = newValue
                }
            )
        }
    }

Составной названныйToggleButtonGroupвидно ниже:

      @Composable
fun ToggleButtonGroup(defaultIndex: Int, values: List<Pair<String, Int>>, onToggleChange: (newValue: Int) -> Unit) {

    var selectedIndex by rememberSaveable {
        mutableStateOf( defaultIndex.coerceIn(0, values.size - 1) )
    }

    Row(
        modifier = Modifier.wrapContentHeight()
    ) {

        values.forEachIndexed { index: Int, value: Pair<String, Int> ->

            FilledTonalButton(
                colors = if (selectedIndex == index) ButtonDefaults.buttonColors() else ButtonDefaults.filledTonalButtonColors(),
                onClick = { selectedIndex = index; onToggleChange(value.second) },
                shape = RectangleShape
            ) {
                Text(text = value.first)
            }
        }
    }
}

Иcharacteristicsданные поступают из моей ViewModel:

      data class Characteristic(val title: String, val weight: Int, var value: Int)
var characteristics by mutableStateOf(listOf<Characteristic>())

Спасибо за любые усилия!

1 ответ

Похоже, это намеренное поведение. В системе отслеживания проблем Google открыта проблема , в которой описана аналогичная проблема. Проблема была отмечена как «предполагаемое поведение», так как этот механизм сброса состояния невидимых элементов при вращении был введен с этой фиксацией:

Сохраняйте состояния только для видимых в данный момент элементов ленивых макетов.

Когда мы сохраняем состояние экрана в таких случаях, как переход на другой экран или чередование действий, мы сохраняем состояние для всех элементов, которые когда-либо были видны в ленивых макетах, таких как LazyColumn. Мы хотим сохранить состояние во время прокрутки пользователем, чтобы он не потерял его при прокрутке назад, однако, когда этот экран больше не активен, сохранение состояний для всех элементов неэффективно, поскольку мы легко можем заполнить весь доступный лимит, предоставленный Bundle. . Вместо этого было бы разумно сохранять состояния только тех элементов, которые были видны при сохранении состояния экрана.

Другие вопросы по тегам