Что такое позиционная мемоизация в Compose
Что проверяют
Знаете ли вы механику Compose, а не только набор функций. Позиционная мемоизация это фундамент, на котором работает remember, и кандидат, который её понимает, может объяснить, почему состояние иногда теряется после безобидной на вид правки разметки.
Как отвечать
Compose хранит запомненные значения в слотах, а слот определяется позицией вызова в дереве композиции. Компилятор расставляет группы по местам вызова, поэтому два одинаковых вызова в разных ветках попадают в разные слоты. Ключом служит место вызова, а не содержимое: это и есть позиционная мемоизация.
val formatted = remember(amount) { formatMoney(amount) }При рекомпозиции Compose приходит в тот же слот и переиспользует значение, если аргументы remember не изменились. Пропал узел из композиции, освободился и слот, значение теряется.
Когда позиции недостаточно, идентичность задают явно: обёртка key(id) вокруг элемента цикла и параметр key у элементов ленивого списка. Без него вставка в начало сдвигает позиции, и состояние переезжает к соседнему элементу.
Стоит развести два механизма. Позиционная мемоизация отвечает за то, где лежит запомненное. Пропуск рекомпозиции отвечает за то, надо ли вообще перевыполнять функцию, и зависит от стабильности типов параметров.
Где спотыкаются
Сводят тему к ключам в списках, как это часто делают краткие пересказы. Ключ элемента это про идентичность при перестановке, а мемоизация по позиции работает и без списков, в любом вызове remember.
Ждут, что remember переживёт поворот экрана или уничтожение процесса. Он живёт ровно столько, сколько узел находится в композиции. Для смены конфигурации нужен rememberSaveable, для более долгой жизни состояние выносят за пределы композиции.
Держат в remember подписки и закрываемые ресурсы, не думая об освобождении. То, что надо остановить при уходе узла, живёт в DisposableEffect, иначе слушатель остаётся висеть после исчезновения экрана.