Какие механизмы управления перерисовкой интерфейса есть в Jetpack Compose
Что проверяют
Понимаете ли вы, что перекомпозиция запускается чтением состояния, и знаете ли инструменты её сужения.
Как отвечать
Правило одно: функция перекомпозируется, когда меняется состояние, которое она читает, или когда меняются её параметры. Значит управление сводится к тому, чтобы читать состояние как можно уже и как можно ниже по дереву.
Механизмы:
1. Стабильность типов. Compose пропускает функцию, если её параметры стабильны и не изменились. Изменяемый класс или обычный список считаются нестабильными, и функция перекомпозируется каждый раз. Лечится неизменяемыми моделями, аннотациями стабильности и неизменяемыми коллекциями из отдельной библиотеки. Отчёт компилятора о стабильности показывает, какие параметры мешают пропуску.
2. Отложенное чтение. Вместо передачи значения передают лямбду, возвращающую его. Тогда чтение состояния происходит внутри той функции, которой оно нужно, и родитель не перекомпозируется. Особенно важно для часто меняющихся величин вроде позиции прокрутки или прогресса анимации.
3. Производное состояние. Когда результат меняется реже источника, его оборачивают: например признак «прокручено ли ниже первого элемента» меняется дважды за всю прокрутку, а сама позиция сотни раз.
4. Запоминание. Дорогие вычисления и создаваемые объекты держат в памяти между перекомпозициями, чтобы не пересоздавать их на каждом проходе.
5. Ключи в списках. Стабильный ключ элемента позволяет сохранить состояние и не перестраивать содержимое при изменении порядка.
6. Фазы отрисовки. Композиция, размещение и рисование выполняются отдельно. Анимация, затрагивающая только последнюю фазу (через слой отрисовки или смещение с лямбдой), вообще не запускает перекомпозицию. Это самый дешёвый способ анимировать.
Измерять надо инспектором разметки со счётчиком перекомпозиций и отчётами компилятора, а не на глаз.
Где спотыкаются
Передают часто меняющееся значение параметром вместо лямбды.
Держат состояние слишком высоко, из-за чего перекомпозируется весь экран.
Используют изменяемые списки в параметрах и теряют пропуск функций.
Вычисляют производное значение напрямую вместо обёртки.